欢迎光临
我们一直在努力

阿里云低价VPS云服务器性能快速评测bench.sh

服务器性能测试在Linux系统中是一项重要的任务,它可以帮助你了解服务器在不同负载下的表现,从而优化服务器配置和资源分配。以下是关于Linux服务器性能测试的基础概念、优势、类型、应用场景以及常见问题的解答。

服务器性能测试通常涉及对CPU、内存、磁盘I/O、网络带宽等资源的测试。这些测试可以帮助你确定服务器的最大承载能力,以及在特定负载下的响应时间和吞吐量。

bench.sh 是一个 Linux 系统性能基准测试工具。可以快速给出服务器的整体配置信息,IO 性能,网络性能。很多人使用它测试 vps 性能。再配合 unixbench.sh 脚本测试,即可全面测试 VPS 的性能。

本地测试服务器配置:2核2G,3M带宽,40G硬盘。

测试结果

使用以下命令运行测试

wget -qO- bench.sh | bash

代码解释:
`wget`:用于从指定URL下载文件
`-qO-`:参数用于不输出下载过程信息,将文件输出到标准输出
`| bash`:将下载内容通过管道传递给bash执行

结果如下图:

bench.sh主要功能

  • 系统信息检测‌:显示操作系统版本、内核版本等基本信息。
  • CPU信息‌:检测CPU型号、核心数、主频等参数。
  • 内存信息‌:显示内存总量、使用情况和swap分区信息。
  • 磁盘信息‌:检测磁盘容量、I/O性能等指标。
  • 网络测试‌:测试与全球多个节点之间的网络连接速度和延迟。
  • 系统负载‌:显示当前系统负载情况‌

bench.sh的优势

与其他系统检测工具相比,bench.sh具有以下优势:

  • 一键执行:无需安装,直接运行即可获取结果
  • 全面信息:覆盖系统、硬件和网络等多个方面
  • 快速高效:检测过程迅速,几分钟内即可完成
  • 可读性强:输出结果清晰易懂,便于分析
  • 跨平台支持:适用于多种Linux发行版

bench.sh使用方法

国外VPS云服务器

使用bench.sh脚本非常简单,只需要在终端中执行以下命令:

wget -qO- bench.sh | bash

或者

curl -Lso- bench.sh | bash

执行后,脚本会自动运行并显示系统各项信息。‘’

国内VPS云服务器

wget -qO- https://github.com/teddysun/across/raw/master/bench.sh | bash

在国内,可以从 GitHub下载脚本(https://github.com/teddysun/across/blob/master/bench.sh)到本地,或者复制下面的脚本代码,保存到 bench.sh 文件中

#!/usr/bin/env bash
#
# Description: A Bench Script by Teddysun
#
# Copyright (C) 2015 - 2025 Teddysun 
# Thanks: LookBack 
# URL: https://teddysun.com/444.html
# https://github.com/teddysun/across/blob/master/bench.sh
#
trap _exit INT QUIT TERM
_red() {
    printf \'\\033[0;31;31m%b\\033[0m\' \"$1\"
}
_green() {
    printf \'\\033[0;31;32m%b\\033[0m\' \"$1\"
}
_yellow() {
    printf \'\\033[0;31;33m%b\\033[0m\' \"$1\"
}
_blue() {
    printf \'\\033[0;31;36m%b\\033[0m\' \"$1\"
}
_exists() {
    local cmd=\"$1\"
    if eval type type >/dev/null 2>&1; then
        eval type \"$cmd\" >/dev/null 2>&1
    elif command >/dev/null 2>&1; then
        command -v \"$cmd\" >/dev/null 2>&1
    else
        which \"$cmd\" >/dev/null 2>&1
    fi
    local rt=$?
    return ${rt}
}
_exit() {
    _red \"\\nThe script has been terminated. Cleaning up files...\\n\"
    # clean up
    rm -fr speedtest.tgz speedtest-cli benchtest_*
    exit 1
}
get_opsy() {
    [ -f /etc/redhat-release ] && awk \'{print $0}\' /etc/redhat-release && return
    [ -f /etc/os-release ] && awk -F\'[= \"]\' \'/PRETTY_NAME/{print $3,$4,$5}\' /etc/os-release && return
    [ -f /etc/lsb-release ] && awk -F\'[=\"]+\' \'/DESCRIPTION/{print $2}\' /etc/lsb-release && return
}
next() {
    printf \"%-70s\\n\" \"-\" | sed \'s/\\s/-/g\'
}
speed_test() {
    local nodeName=\"$2\"
    if [ -z \"$1\" ];then
        ./speedtest-cli/speedtest --progress=no --accept-license --accept-gdpr >./speedtest-cli/speedtest.log 2>&1
    else
        ./speedtest-cli/speedtest --progress=no --server-id=\"$1\" --accept-license --accept-gdpr >./speedtest-cli/speedtest.log 2>&1
    fi
    if [ $? -eq 0 ]; then
        local dl_speed up_speed latency
        dl_speed=$(awk \'/Download/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
        up_speed=$(awk \'/Upload/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
        latency=$(awk \'/Latency/{print $3\" \"$4}\' ./speedtest-cli/speedtest.log)
        if [[ -n \"${dl_speed}\" && -n \"${up_speed}\" && -n \"${latency}\" ]]; then
            printf \"\\033[0;33m%-18s\\033[0;32m%-18s\\033[0;31m%-20s\\033[0;36m%-12s\\033[0m\\n\" \" ${nodeName}\" \"${up_speed}\" \"${dl_speed}\" \"${latency}\"
        fi
    fi
}
speed() {
    speed_test \'\' \'Speedtest.net\'
    speed_test \'21541\' \'Los Angeles, US\'
    speed_test \'43860\' \'Dallas, US\'
    speed_test \'40879\' \'Montreal, CA\'
    speed_test \'61933\' \'Paris, FR\'
    speed_test \'28922\' \'Amsterdam, NL\'
    speed_test \'25858\' \'Beijing, CN\'
    speed_test \'24447\' \'Shanghai, CN\'
    speed_test \'60572\' \'Guangzhou, CN\'
    speed_test \'32155\' \'Hong Kong, CN\'
    speed_test \'13623\' \'Singapore, SG\'
    speed_test \'48463\' \'Tokyo, JP\'
}
io_test() {
    (LANG=C dd if=/dev/zero of=benchtest_$$ bs=512k count=\"$1\" conv=fdatasync && rm -f benchtest_$$) 2>&1 | awk -F \'[,,]\' \'{io=$NF} END { print io}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
}
calc_size() {
    local raw=$1
    local total_size=0
    local num=1
    local unit=\"KB\"
    if ! [[ ${raw} =~ ^[0-9]+$ ]]; then
        echo \"\"
        return
    fi
    if [ \"${raw}\" -ge 1073741824 ]; then
        num=1073741824
        unit=\"TB\"
    elif [ \"${raw}\" -ge 1048576 ]; then
        num=1048576
        unit=\"GB\"
    elif [ \"${raw}\" -ge 1024 ]; then
        num=1024
        unit=\"MB\"
    elif [ \"${raw}\" -eq 0 ]; then
        echo \"${total_size}\"
        return
    fi
    total_size=$(awk \'BEGIN{printf \"%.1f\", \'\"$raw\"\' / \'$num\'}\')
    echo \"${total_size} ${unit}\"
}
# since calc_size converts kilobyte to MB, GB and TB
# to_kibyte converts zfs size from bytes to kilobyte
to_kibyte() {
    local raw=$1
    awk \'BEGIN{printf \"%.0f\", \'\"$raw\"\' / 1024}\'
}
calc_sum() {
    local arr=(\"$@\")
    local s
    s=0
    for i in \"${arr[@]}\"; do
        s=$((s + i))
    done
    echo ${s}
}
check_virt() {
    _exists \"dmesg\" && virtualx=\"$(dmesg 2>/dev/null)\"
    if _exists \"dmidecode\"; then
        sys_manu=\"$(dmidecode -s system-manufacturer 2>/dev/null)\"
        sys_product=\"$(dmidecode -s system-product-name 2>/dev/null)\"
        sys_ver=\"$(dmidecode -s system-version 2>/dev/null)\"
    else
        sys_manu=\"\"
        sys_product=\"\"
        sys_ver=\"\"
    fi
    if grep -qa docker /proc/1/cgroup; then
        virt=\"Docker\"
    elif grep -qa lxc /proc/1/cgroup; then
        virt=\"LXC\"
    elif grep -qa container=lxc /proc/1/environ; then
        virt=\"LXC\"
    elif [[ -f /proc/user_beancounters ]]; then
        virt=\"OpenVZ\"
    elif [[ \"${virtualx}\" == *kvm-clock* ]]; then
        virt=\"KVM\"
    elif [[ \"${sys_product}\" == *KVM* ]]; then
        virt=\"KVM\"
    elif [[ \"${sys_manu}\" == *QEMU* ]]; then
        virt=\"KVM\"
    elif [[ \"${cname}\" == *KVM* ]]; then
        virt=\"KVM\"
    elif [[ \"${cname}\" == *QEMU* ]]; then
        virt=\"KVM\"
    elif [[ \"${virtualx}\" == *\"VMware Virtual Platform\"* ]]; then
        virt=\"VMware\"
    elif [[ \"${sys_product}\" == *\"VMware Virtual Platform\"* ]]; then
        virt=\"VMware\"
    elif [[ \"${virtualx}\" == *\"Parallels Software International\"* ]]; then
        virt=\"Parallels\"
    elif [[ \"${virtualx}\" == *VirtualBox* ]]; then
        virt=\"VirtualBox\"
    elif [[ -e /proc/xen ]]; then
        if grep -q \"control_d\" \"/proc/xen/capabilities\" 2>/dev/null; then
            virt=\"Xen-Dom0\"
        else
            virt=\"Xen-DomU\"
        fi
    elif [ -f \"/sys/hypervisor/type\" ] && grep -q \"xen\" \"/sys/hypervisor/type\"; then
        virt=\"Xen\"
    elif [[ \"${sys_manu}\" == *\"Microsoft Corporation\"* ]]; then
        if [[ \"${sys_product}\" == *\"Virtual Machine\"* ]]; then
            if [[ \"${sys_ver}\" == *\"7.0\"* || \"${sys_ver}\" == *\"Hyper-V\" ]]; then
                virt=\"Hyper-V\"
            else
                virt=\"Microsoft Virtual Machine\"
            fi
        fi
    else
        virt=\"Dedicated\"
    fi
}
ipv4_info() {
    local org city country region
    org=\"$(wget -q -T10 -O- http://ipinfo.io/org)\"
    city=\"$(wget -q -T10 -O- http://ipinfo.io/city)\"
    country=\"$(wget -q -T10 -O- http://ipinfo.io/country)\"
    region=\"$(wget -q -T10 -O- http://ipinfo.io/region)\"
    if [[ -n \"${org}\" ]]; then
        echo \" Organization       : $(_blue \"${org}\")\"
    fi
    if [[ -n \"${city}\" && -n \"${country}\" ]]; then
        echo \" Location           : $(_blue \"${city} / ${country}\")\"
    fi
    if [[ -n \"${region}\" ]]; then
        echo \" Region             : $(_yellow \"${region}\")\"
    fi
    if [[ -z \"${org}\" ]]; then
        echo \" Region             : $(_red \"No ISP detected\")\"
    fi
}
install_speedtest() {
    if [ ! -e \"./speedtest-cli/speedtest\" ]; then
        sys_bit=\"\"
        local sysarch
        sysarch=\"$(uname -m)\"
        if [ \"${sysarch}\" = \"unknown\" ] || [ \"${sysarch}\" = \"\" ]; then
            sysarch=\"$(arch)\"
        fi
        if [ \"${sysarch}\" = \"x86_64\" ]; then
            sys_bit=\"x86_64\"
        fi
        if [ \"${sysarch}\" = \"i386\" ] || [ \"${sysarch}\" = \"i686\" ]; then
            sys_bit=\"i386\"
        fi
        if [ \"${sysarch}\" = \"armv8\" ] || [ \"${sysarch}\" = \"armv8l\" ] || [ \"${sysarch}\" = \"aarch64\" ] || [ \"${sysarch}\" = \"arm64\" ]; then
            sys_bit=\"aarch64\"
        fi
        if [ \"${sysarch}\" = \"armv7\" ] || [ \"${sysarch}\" = \"armv7l\" ]; then
            sys_bit=\"armhf\"
        fi
        if [ \"${sysarch}\" = \"armv6\" ]; then
            sys_bit=\"armel\"
        fi
        [ -z \"${sys_bit}\" ] && _red \"Error: Unsupported system architecture (${sysarch}).\\n\" && exit 1
        url1=\"https://install.speedtest.net/app/cli/ookla-speedtest-1.2.0-linux-${sys_bit}.tgz\"
        url2=\"https://dl.lamp.sh/files/ookla-speedtest-1.2.0-linux-${sys_bit}.tgz\"
        if ! wget --no-check-certificate -q -T10 -O speedtest.tgz ${url1}; then
            if ! wget --no-check-certificate -q -T10 -O speedtest.tgz ${url2}; then
                _red \"Error: Failed to download speedtest-cli.\\n\" && exit 1
            fi
        fi
        mkdir -p speedtest-cli && tar zxf speedtest.tgz -C ./speedtest-cli && chmod +x ./speedtest-cli/speedtest
        rm -f speedtest.tgz
    fi
    printf \"%-18s%-18s%-20s%-12s\\n\" \" Node Name\" \"Upload Speed\" \"Download Speed\" \"Latency\"
}
print_intro() {
    echo \"-------------------- A Bench.sh Script By Teddysun -------------------\"
    echo \" Version            : $(_green v2025-05-08)\"
    echo \" Usage              : $(_red \"wget -qO- bench.sh | bash\")\"
}
# Get System information
get_system_info() {
    cname=$(awk -F: \'/model name/ {name=$2} END {print name}\' /proc/cpuinfo | sed \'s/^[ \\t]*//;s/[ \\t]*$//\')
    cores=$(awk -F: \'/^processor/ {core++} END {print core}\' /proc/cpuinfo)
    freq=$(awk -F\'[ :]\' \'/cpu MHz/ {print $4;exit}\' /proc/cpuinfo)
    ccache=$(awk -F: \'/cache size/ {cache=$2} END {print cache}\' /proc/cpuinfo | sed \'s/^[ \\t]*//;s/[ \\t]*$//\')
    cpu_aes=$(grep -i \'aes\' /proc/cpuinfo)
    cpu_virt=$(grep -Ei \'vmx|svm\' /proc/cpuinfo)
    tram=$(
        LANG=C
        free | awk \'/Mem/ {print $2}\'
    )
    tram=$(calc_size \"$tram\")
    uram=$(
        LANG=C
        free | awk \'/Mem/ {print $3}\'
    )
    uram=$(calc_size \"$uram\")
    swap=$(
        LANG=C
        free | awk \'/Swap/ {print $2}\'
    )
    swap=$(calc_size \"$swap\")
    uswap=$(
        LANG=C
        free | awk \'/Swap/ {print $3}\'
    )
    uswap=$(calc_size \"$uswap\")
    up=$(awk \'{a=$1/86400;b=($1%86400)/3600;c=($1%3600)/60} {printf(\"%d days, %d hour %d min\\n\",a,b,c)}\' /proc/uptime)
    if _exists \"w\"; then
        load=$(
            LANG=C
            w | head -1 | awk -F\'load average:\' \'{print $2}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
        )
    elif _exists \"uptime\"; then
        load=$(
            LANG=C
            uptime | head -1 | awk -F\'load average:\' \'{print $2}\' | sed \'s/^[ \\t]*//;s/[ \\t]*$//\'
        )
    fi
    opsy=$(get_opsy)
    arch=$(uname -m)
    if _exists \"getconf\"; then
        lbit=$(getconf LONG_BIT)
    else
        echo \"${arch}\" | grep -q \"64\" && lbit=\"64\" || lbit=\"32\"
    fi
    kern=$(uname -r)
    in_kernel_no_swap_total_size=$(
        LANG=C
        df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk \'{ print $2 }\'
    )
    swap_total_size=$(free -k | grep Swap | awk \'{print $2}\')
    zfs_total_size=$(to_kibyte \"$(calc_sum \"$(zpool list -o size -Hp 2> /dev/null)\")\")
    disk_total_size=$(calc_size $((swap_total_size + in_kernel_no_swap_total_size + zfs_total_size)))
    in_kernel_no_swap_used_size=$(
        LANG=C
        df -t simfs -t ext2 -t ext3 -t ext4 -t btrfs -t xfs -t vfat -t ntfs --total 2>/dev/null | grep total | awk \'{ print $3 }\'
    )
    swap_used_size=$(free -k | grep Swap | awk \'{print $3}\')
    zfs_used_size=$(to_kibyte \"$(calc_sum \"$(zpool list -o allocated -Hp 2> /dev/null)\")\")
    disk_used_size=$(calc_size $((swap_used_size + in_kernel_no_swap_used_size + zfs_used_size)))
    tcpctrl=$(sysctl net.ipv4.tcp_congestion_control | awk -F \' \' \'{print $3}\')
}
# Print System information
print_system_info() {
    if [ -n \"$cname\" ]; then
        echo \" CPU Model          : $(_blue \"$cname\")\"
    else
        echo \" CPU Model          : $(_blue \"CPU model not detected\")\"
    fi
    if [ -n \"$freq\" ]; then
        echo \" CPU Cores          : $(_blue \"$cores @ $freq MHz\")\"
    else
        echo \" CPU Cores          : $(_blue \"$cores\")\"
    fi
    if [ -n \"$ccache\" ]; then
        echo \" CPU Cache          : $(_blue \"$ccache\")\"
    fi
    if [ -n \"$cpu_aes\" ]; then
        echo \" AES-NI             : $(_green \"\\xe2\\x9c\\x93 Enabled\")\"
    else
        echo \" AES-NI             : $(_red \"\\xe2\\x9c\\x97 Disabled\")\"
    fi
    if [ -n \"$cpu_virt\" ]; then
        echo \" VM-x/AMD-V         : $(_green \"\\xe2\\x9c\\x93 Enabled\")\"
    else
        echo \" VM-x/AMD-V         : $(_red \"\\xe2\\x9c\\x97 Disabled\")\"
    fi
    echo \" Total Disk         : $(_yellow \"$disk_total_size\") $(_blue \"($disk_used_size Used)\")\"
    echo \" Total Mem          : $(_yellow \"$tram\") $(_blue \"($uram Used)\")\"
    if [ \"$swap\" != \"0\" ]; then
        echo \" Total Swap         : $(_blue \"$swap ($uswap Used)\")\"
    fi
    echo \" System uptime      : $(_blue \"$up\")\"
    echo \" Load average       : $(_blue \"$load\")\"
    echo \" OS                 : $(_blue \"$opsy\")\"
    echo \" Arch               : $(_blue \"$arch ($lbit Bit)\")\"
    echo \" Kernel             : $(_blue \"$kern\")\"
    echo \" TCP CC             : $(_yellow \"$tcpctrl\")\"
    echo \" Virtualization     : $(_blue \"$virt\")\"
    echo \" IPv4/IPv6          : $online\"
}
print_io_test() {
    freespace=$(df -m . | awk \'NR==2 {print $4}\')
    if [ -z \"${freespace}\" ]; then
        freespace=$(df -m . | awk \'NR==3 {print $3}\')
    fi
    if [ \"${freespace}\" -gt 1024 ]; then
        writemb=2048
        io1=$(io_test ${writemb})
        echo \" I/O Speed(1st run) : $(_yellow \"$io1\")\"
        io2=$(io_test ${writemb})
        echo \" I/O Speed(2nd run) : $(_yellow \"$io2\")\"
        io3=$(io_test ${writemb})
        echo \" I/O Speed(3rd run) : $(_yellow \"$io3\")\"
        ioraw1=$(echo \"$io1\" | awk \'NR==1 {print $1}\')
        [[ \"$(echo \"$io1\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw1=$(awk \'BEGIN{print \'\"$ioraw1\"\' * 1024}\')
        ioraw2=$(echo \"$io2\" | awk \'NR==1 {print $1}\')
        [[ \"$(echo \"$io2\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw2=$(awk \'BEGIN{print \'\"$ioraw2\"\' * 1024}\')
        ioraw3=$(echo \"$io3\" | awk \'NR==1 {print $1}\')
        [[ \"$(echo \"$io3\" | awk \'NR==1 {print $2}\')\" == \"GB/s\" ]] && ioraw3=$(awk \'BEGIN{print \'\"$ioraw3\"\' * 1024}\')
        ioall=$(awk \'BEGIN{print \'\"$ioraw1\"\' + \'\"$ioraw2\"\' + \'\"$ioraw3\"\'}\')
        ioavg=$(awk \'BEGIN{printf \"%.1f\", \'\"$ioall\"\' / 3}\')
        echo \" I/O Speed(average) : $(_yellow \"$ioavg MB/s\")\"
    else
        echo \" $(_red \"Not enough space for I/O Speed test!\")\"
    fi
}
print_end_time() {
    end_time=$(date +%s)
    time=$((end_time - start_time))
    if [ ${time} -gt 60 ]; then
        min=$((time / 60))
        sec=$((time % 60))
        echo \" Finished in        : ${min} min ${sec} sec\"
    else
        echo \" Finished in        : ${time} sec\"
    fi
    date_time=$(date \'+%Y-%m-%d %H:%M:%S %Z\')
    echo \" Timestamp          : $date_time\"
}
! _exists \"wget\" && _red \"Error: wget command not found.\\n\" && exit 1
! _exists \"free\" && _red \"Error: free command not found.\\n\" && exit 1
# check for curl/wget
_exists \"curl\" && local_curl=true
# test if the host has IPv4/IPv6 connectivity
[[ -n ${local_curl} ]] && ip_check_cmd=\"curl -s -m 4\" || ip_check_cmd=\"wget -qO- -T 4\"
ipv4_check=$( (ping -4 -c 1 -W 4 ipv4.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -4 icanhazip.com 2> /dev/null)
ipv6_check=$( (ping -6 -c 1 -W 4 ipv6.google.com >/dev/null 2>&1 && echo true) || ${ip_check_cmd} -6 icanhazip.com 2> /dev/null)
if [[ -z \"$ipv4_check\" && -z \"$ipv6_check\" ]]; then
    _yellow \"Warning: Both IPv4 and IPv6 connectivity were not detected.\\n\"
fi
[[ -z \"$ipv4_check\" ]] && online=\"$(_red \"\\xe2\\x9c\\x97 Offline\")\" || online=\"$(_green \"\\xe2\\x9c\\x93 Online\")\"
[[ -z \"$ipv6_check\" ]] && online+=\" / $(_red \"\\xe2\\x9c\\x97 Offline\")\" || online+=\" / $(_green \"\\xe2\\x9c\\x93 Online\")\"
start_time=$(date +%s)
get_system_info
check_virt
clear
print_intro
next
print_system_info
ipv4_info
next
print_io_test
next
install_speedtest && speed && rm -fr speedtest-cli
next
print_end_time
next

bench.sh文件赋予执行权限chmod +x bench.sh),然后执行脚本./bench.sh

chmod +x bench.sh
./bench.sh

注意事项

使用bench.sh脚本时,请注意以下几点:

  • 确保有足够的权限执行脚本
  • 网络测试可能会消耗一定流量,请在合适的环境下运行
  • 定期运行脚本可以帮助监控系统性能变化

结语

bench.sh脚本是一个便捷而强大的Linux系统信息检测工具。通过使用这个一键测试脚本,系统管理员可以快速获取服务器的各项重要信息,为优化系统性能和解决潜在问题提供有力支持。无论是日常维护还是故障排查,bench.sh都是一个值得收藏的实用工具。

赞(0) 打赏
主机商所有内容均来自网络,若无意侵犯到您的权利,请及时与联系 QQ 2232175042,将在48小时内删除相关内容!!主机测评网 » 阿里云低价VPS云服务器性能快速评测bench.sh

主机商评测网 找服务器 更专业 更方便 更快捷!

专注IDC行业资源共享发布,给大家带来方便快捷的资源查找平台!

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫