20221204-Linux服务器如何进行压力测试
Linux服务器如何进行压力测试
Linux服务器压力测试的目的
Linux压力测试是检验交付Linux服务器性能稳定性的最有效方式。在业务还未部署的情况下,可以通过对服务器CPU、内存、磁盘IO进行简单压力测试,提前暴露硬件问题。
stress-ng进行Linux系统压力测试(CPU、内存、磁盘IO)
一).环境
OS:CentOS Linux release 7.4
# more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
CPU:1核心
Memory:1GB
二).stress-ng作用及常用参数
stress-ng兼容stress, 支持产生对CPU、内存、磁盘等各种复杂的压力测试。
常用命令参数如下:
选项 | 含义 |
---|---|
-t, --timeout | 指定运行多少秒停止 |
–backoff | 指定等待N微妙后开始运行 |
-c, --cpu | 指定产生N个处理sqrt()函数的CPU进程,也就是每个进程不停计算随机数的平方根 |
-i, --io | 指定产生N个处理sync()函数的磁盘I/O进程,sync()用于将内存上的内容写到硬盘上 |
-m, --vm | 指定产生n个进程,每个进程不断调用内存分配malloc函数和内存释放free函数 |
–vm-bytes | 指定调用malloc函数时分配内存的字节数 (默认256MB) |
–vm-stride | 应该是给内存赋值,touch a byte every B bytes (default is 4096) |
–vm-hang | 指定malloc函数分配的内存转入睡眠状态 N 秒,然后free()释放掉,一直重复执行这个过程 |
–vm-keep | 冗余内存,而不是释放和重新分配 |
-d, --hdd | 指定产生N个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件) |
–hdd-bytes | 指定写入文件大小,默认为1GB |
三).stress-ng安装
1.获取stress-ng安装包
# wget https://fossies.org/linux/privat/stress-ng-0.15.00.tar.gz
2.解压缩stress-ng安装包
# tar xf stress-ng-0.15.00.tar.gz
3.编译
# cd stress-ng-0.15.00/
# make
4.安装
# make install
mkdir -p /usr/bin
cp stress-ng /usr/bin
mkdir -p /usr/share/man/man1
cp stress-ng.1.gz /usr/share/man/man1
mkdir -p /usr/share/stress-ng/example-jobs
cp -r example-jobs/*.job /usr/share/stress-ng/example-jobs
mkdir -p /usr/share/bash-completion/completions
cp bash-completion/stress-ng /usr/share/bash-completion/completions
5.确认安装版本
# stress-ng --version
stress-ng, version 0.15.00 (gcc 4.8, x86_64 Linux 3.10.0-693.11.6.el7.x86_64)
四).通过stress-ng进行压力测试
查看CPU个数等情况
# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 78
model name : Intel(R) Core(TM) i5-6200U CPU @ 2.30GHz
stepping : 3
microcode : 0xcc
cpu MHz : 2400.002
cache size : 3072 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 22
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon nopl xtopology tsc_reliable nonstop_tsc pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm 3dnowprefetch spec_ctrl ibpb_support fsgsbase smep arat
bogomips : 4800.00
clflush size : 64
cache_alignment : 64
address sizes : 40 bits physical, 48 bits virtual
power management:
查看内存大小等情况
# cat /proc/meminfo
MemTotal: 1007600 kB
MemFree: 352660 kB
MemAvailable: 553008 kB
Buffers: 2116 kB
Cached: 317624 kB
SwapCached: 0 kB
Active: 265148 kB
Inactive: 239676 kB
Active(anon): 186020 kB
Inactive(anon): 6552 kB
Active(file): 79128 kB
Inactive(file): 233124 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 2097148 kB
SwapFree: 2097148 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 185116 kB
Mapped: 87716 kB
Shmem: 7488 kB
Slab: 62788 kB
SReclaimable: 31696 kB
SUnreclaim: 31092 kB
KernelStack: 4736 kB
PageTables: 14712 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 2600948 kB
Committed_AS: 1236704 kB
VmallocTotal: 34359738367 kB
VmallocUsed: 176160 kB
VmallocChunk: 34359326716 kB
HardwareCorrupted: 0 kB
AnonHugePages: 40960 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
DirectMap4k: 77696 kB
DirectMap2M: 970752 kB
DirectMap1G: 0 kB
查看磁盘大小等情况
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos_chefserver-root 17G 10G 7.1G 59% /
devtmpfs 477M 0 477M 0% /dev
tmpfs 492M 0 492M 0% /dev/shm
tmpfs 492M 7.2M 485M 2% /run
tmpfs 492M 0 492M 0% /sys/fs/cgroup
/dev/sda1 1014M 217M 798M 22% /boot
tmpfs 99M 12K 99M 1% /run/user/42
tmpfs 99M 0 99M 0% /run/user/0
查看压测前进程状况
# top
查看压测前内存状况
# free
CPU压测:开启1个CPU进程执行sqrt计算,180秒后结束
# stress-ng --cpu 1 --timeout 180
stress-ng: info: [10412] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info: [10412] dispatching hogs: 1 cpu
stress-ng: info: [10412] successful run completed in 180.00s (3 mins, 0.00 secs)
# stress-ng --cpu 1 --timeout 604800
##进行连续7*24小时运算
内存压测:开启4个进程分配内存,每次分配512M,保持180秒后释放,180秒后退出
# stress-ng --vm 4 --vm-bytes 512M --vm-hang 180 --timeout 180s
stress-ng: info: [10231] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info: [10231] dispatching hogs: 4 vm
stress-ng: warn: [10231] metrics-check: all bogo-op counters are zero, data may be incorrect
stress-ng: info: [10231] successful run completed in 180.04s (3 mins, 0.04 secs)
压测磁盘io:开启5个磁盘IO进程,每次写1GB数据到磁盘,180秒后退出
# stress-ng --hdd 5 --hdd-bytes 1G --timeout 180s
stress-ng: info: [10527] setting to a 180 second (3 mins, 0.00 secs) run per stressor
stress-ng: info: [10527] dispatching hogs: 5 hdd
stress-ng: info: [10527] successful run completed in 182.16s (3 mins, 2.16 secs)
FIO进行Linux系统压力测试(磁盘IO)
一).环境
OS:CentOS Linux release 7.4
# more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
CPU:1核心
Memory:1GB
二).FIO作用及常用参数
FIO是测试IOPS的非常好的工具,用来对磁盘进行压力测试和验证。磁盘IO是检查磁盘性能的重要指标,可以按照负载情况分成照顺序读写,随机读写两大类。FIO是一个可以产生很多线程或进程并执行用户指定的特定类型I/O操作的工具,FIO的典型用途是编写和模拟的I/O负载匹配的作业文件。也就是说FIO 是一个多线程io生成工具,可以生成多种IO模式,用来测试磁盘设备的性能(也包含文件系统:如针对网络文件系统 NFS 的IO测试)
FIO 命令常用参数:
参数说明:
filename=/dev/sdb1 测试文件名称,通常选择需要测试的盘的data目录。
direct=1 是否使用directIO,测试过程绕过OS自带的buffer,使测试磁盘的结果更真实。Linux读写的时候,内核维护了缓存,数据先写到缓存,后面再后台写到SSD。读的时候也优先读缓存里的数据。这样速度可以加快,但是一旦掉电缓存里的数据就没了。所以有一种模式叫做DirectIO,跳过缓存,直接读写SSD。
rw=randwrite 测试随机写的I/O
rw=randread:测试随机读的I/O
rw=randrw 测试随机写和读的I/O
rw=read:测试读的I/O
rw=write:测试写的I/O
bs=16k 单次io的块文件大小为16k
bsrange=512-2048 同上,提定数据块的大小范围
size=5G 每个线程读写的数据量是5GB。
numjobs=1 每个job(任务)开1个线程,这里用了几,后面每个用-name指定的任务就开几个线程测试。所以最终线程数=任务数(几个name=jobx)* numjobs。
name=job1:一个任务的名字,重复了也没关系。如果fio -name=job1 -name=job2,建立了两个任务,共享-name=job1之前的参数。-name之后的就是job2任务独有的参数。
thread 使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。
runtime=1000 测试时间为1000秒,如果不写则一直将5g文件分4k每次写完为止。
allow_mounted_write=1 是否允许对存储设备写入数据,各取值含义,1:允许,0:不允许
ioengine=libaio 指定io引擎使用libaio方式。libaio:Linux本地异步I/O。请注意,Linux可能只支持具有非缓冲I/O的排队行为(设置为“direct=1”或“buffered=0”);rbd:通过librbd直接访问CEPH Rados
iodepth=16 队列的深度为16.在异步模式下,CPU不能一直无限的发命令到SSD。比如SSD执行读写如果发生了卡顿,那有可能系统会一直不停的发命令,几千个,甚至几万个,这样一方面SSD扛不住,另一方面这么多命令会很占内存,系统也要挂掉了。这样,就带来一个参数叫做队列深度。
Block Devices(RBD),无需使用内核RBD驱动程序(rbd.ko)。该参数包含很多ioengine,如:libhdfs/rdma等
rwmixwrite=30 在混合读写的模式下,写占30%
group_reporting 关于显示结果的,汇总每个进程的信息。
此外
lockmem=1g 只使用1g内存进行测试。
zero_buffers 用0初始化系统buffer。
nrfiles=8 每个进程生成文件的数量。
磁盘读写常用测试点:
1. Read=100% Ramdon=100% rw=randread (100%随机读)
2. Read=100% Sequence=100% rw=read (100%顺序读)
3. Write=100% Sequence=100% rw=write (100%顺序写)
4. Write=100% Ramdon=100% rw=randwrite (100%随机写)
5. Read=70% Sequence=100% rw=rw, rwmixread=70, rwmixwrite=30
(70%顺序读,30%顺序写)
6. Read=70% Ramdon=100% rw=randrw, rwmixread=70, rwmixwrite=30
(70%随机读,30%随机写)
三).fio安装
1.获取fio安装包
# wget https://brick.kernel.dk/snaps/fio-2.1.10.tar.gz --no-check-certificate
2.解压缩fio安装包
# tar xf fio-2.1.10.tar.gz
3.编译
安装fio工具依赖的软件包libaio-devel
# yum install libaio-devel
# cd fio-2.1.10/
# ./configure
# make
4.安装
# make install
install -m 755 -d /usr/local/bin
install fio tools/fio_generate_plots tools/plot/fio2gnuplot tools/genfio /usr/local/bin
install -m 755 -d /usr/local/man/man1
install -m 644 fio.1 /usr/local/man/man1
install -m 644 tools/fio_generate_plots.1 /usr/local/man/man1
install -m 644 tools/plot/fio2gnuplot.1 /usr/local/man/man1
install -m 755 -d /usr/local/share/fio
install -m 644 tools/plot/*gpm /usr/local/share/fio/
5.确认安装版本
# fio -version
fio-2.1.10
四).通过FIO进行压力测试
FIO例子:单次io的块文件大小为4k,使用directIO,使用pthread_create创建线程,队列的深度为16
# fio -ioengine=libaio -bs=4k -direct=1 -thread -rw=read -filename=/dev/sda -name="BS 4KB read test" -iodepth=16 -runtime=60
BS 4KB read test: (g=0): rw=read, bs=4K-4K/4K-4K/4K-4K, ioengine=libaio, iodepth=16
fio-2.1.10
Starting 1 thread
Jobs: 1 (f=1): [R] [5.3% done] [105KB/0KB/0KB /s] [26/0/0 iops] [eta 18m:11s]
BS 4KB read test: (groupid=0, jobs=1): err= 0: pid=14689: Sun Dec 4 01:52:28 2022
read : io=1083.9MB, bw=18323KB/s, iops=4580, runt= 60571msec
slat (usec): min=23, max=27887, avg=62.91, stdev=142.56
clat (usec): min=1, max=782461, avg=3425.69, stdev=23047.85
lat (usec): min=45, max=782608, avg=3489.34, stdev=23059.79
clat percentiles (usec):
| 1.00th=[ 668], 5.00th=[ 692], 10.00th=[ 708], 20.00th=[ 724],
| 30.00th=[ 732], 40.00th=[ 756], 50.00th=[ 780], 60.00th=[ 852],
| 70.00th=[ 1064], 80.00th=[ 1704], 90.00th=[ 4320], 95.00th=[ 6432],
| 99.00th=[42240], 99.50th=[166912], 99.90th=[387072], 99.95th=[399360],
| 99.99th=[643072]
bw (KB /s): min= 91, max=75016, per=100.00%, avg=18788.61, stdev=26522.46
lat (usec) : 2=0.01%, 4=0.01%, 10=0.01%, 50=0.01%, 100=0.02%
lat (usec) : 250=0.07%, 500=0.11%, 750=38.31%, 1000=29.12%
lat (msec) : 2=14.61%, 4=6.90%, 10=9.26%, 20=0.52%, 50=0.28%
lat (msec) : 100=0.17%, 250=0.31%, 500=0.28%, 750=0.02%, 1000=0.01%
cpu : usr=0.60%, sys=30.55%, ctx=26540, majf=0, minf=24
IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=100.0%, 32=0.0%, >=64=0.0%
submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.1%, 32=0.0%, 64=0.0%, >=64=0.0%
issued : total=r=277454/w=0/d=0, short=r=0/w=0/d=0
latency : target=0, window=0, percentile=100.00%, depth=16
Run status group 0 (all jobs):
READ: io=1083.9MB, aggrb=18322KB/s, minb=18322KB/s, maxb=18322KB/s, mint=60571msec, maxt=60571msec
Disk stats (read/write):
sda: ios=277450/57, merge=0/8, ticks=737638/184, in_queue=740248, util=99.04%
FIO压测结果说明:
io=执行了多少M的IO
bw=平均IO带宽
iops=IOPS,每秒的输入输出量
runt=线程运行时间
slat=提交延迟,提交该IO请求到kernel所花的时间(不包括kernel处理的时间)
clat=完成延迟, 提交该IO请求到kernel后,处理所花的时间
lat=响应时间
bw=带宽
cpu=利用率
IO depths=io队列
IO submit=单个IO提交要提交的IO数
IO complete=Like the above submit number, but for completions instead.
IO issued=The number of read/write requests issued, and how many of them were short.
IO latencies=IO完延迟的分布
io=总共执行了多少size的IO
aggrb=group总带宽
minb=最小.平均带宽.
maxb=最大平均带宽.
mint=group中线程的最短运行时间.
maxt=group中线程的最长运行时间.
ios=所有group总共执行的IO数.
merge=总共发生的IO合并数.
ticks=Number of ticks we kept the disk busy.
io_queue=花费在队列上的总共时间.
util=磁盘利用率
顺序读
# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=1m -rw=read -numjobs=1 --ramp_time=10 -runtime=20m -group_reporting -name=mytest
顺序写:
# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=1m -rw=write -numjobs=1 --ramp_time=10 -runtime=20m -group_reporting -name=mytest
随机读:
# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=4k -rw=randread -numjobs=4 --ramp_time=10 -runtime=20m -group_reporting -name=mytest
随机写:
# fio -filename=/dev/sda -direct=1 -ioengine=libaio -iodepth=128 -bs=4k -rw=randwrite -numjobs=4 --ramp_time=10 -runtime=20m -group_reporting -name=mytest
memtester进行Linux系统压力测试(内存)
一).环境
OS:CentOS Linux release 7.4
# more /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
CPU:1核心
Memory:1GB
二).memtester作用及常用参数
一款在用户空间下,用于测试内存正确性的实用工具,适用于大多数平台。可以在32位或64位的类Unix操作系统编译和运行(当然也包括MacOs)。这款工具主要面向硬件开发人员,从4.1.0版本开始,memtester可以指定起始物理内存地址进行测试。
memtester 命令常用参数:
Usage: memtester [-p physaddrbase [-d device]] <mem>[B|K|M|G] [loops]
参数解释
-p PHYSADDR: 用于指定起始物理内存地址开始测试(16进制的地址格式),一般是硬件工程师用来测试内存映射的设备IO等场景。指定内存地址会覆盖对应地址的内存数据(这部分内存可能是系统或者其他应用在用的),从而导致crash。
-d 默认使用/dev/mem,我们不用指定 mem: 默认使用M(MB),可以指定B, K, M, or G(分别代表 bytes, kilobytes, megabytes, or gigabytes)
loops:测试次数,默认无限次数执行下去
三).memtester安装
1.获取memtester安装包
# wget https://fossies.org/linux/misc/memtester-4.5.1.tar.gz
2.解压缩fio安装包
# tar xf memtester-4.5.1.tar.gz
3.编译
# cd memtester-4.5.1/
# make
4.安装
# make install
mkdir -m 755 -p /usr/local/bin
install -m 755 memtester /usr/local/bin/
mkdir -m 755 -p /usr/local/man/man8
gzip -c memtester.8 >memtester.8.gz ; install -m 644 memtester.8.gz /usr/local/man/man8/
5.确认安装版本
# memtester version
memtester version 4.5.1 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffffffffffff000
四).通过memtester进行压力测试
内存压测:分配512m内存用于memtester,循环1次
# memtester 512M 1
memtester version 4.5.1 (64-bit)
Copyright (C) 2001-2020 Charles Cazabon.
Licensed under the GNU General Public License version 2 (only).
pagesize is 4096
pagesizemask is 0xfffffffffffff000
want 512MB (536870912 bytes)
got 512MB (536870912 bytes), trying mlock ...locked.
Loop 1/1:
Stuck Address : ok
Random Value : ok
Compare XOR : ok
Compare SUB : ok
Compare MUL : ok
Compare DIV : ok
Compare OR : ok
Compare AND : ok
Sequential Increment: ok
Solid Bits : ok
Block Sequential : ok
Checkerboard : ok
Bit Spread : ok
Bit Flip : ok
Walking Ones : ok
Walking Zeroes : ok
8-bit Writes : ok
16-bit Writes : ok
Done.
退出码
0:正常退出
x01:内存分配或者锁定失败
x02:stuck Address测试失败
x04:其他测试失败
最佳实践
1.在32位系统上运行memtester的话,memtester最多只能申请使用**4GB**内存。
2.不要指定memtester测试内存大于系统的可用内存,如果超额申请过多内存,会明显影响其他进程,最终可能会被系统杀掉(OOM killer)(其实这么做根本无法启动memtester)
3.尽量在root权限下执行memtester,以便让memtester能申请到指定的内存大小。
Linux压力测试的判断
测试通过标准:
1.测试时间周期内及过程中未出现系统无法响应的情况;
2.测试过程中监控内存和CPU频率、带宽、温度、功耗,无降频现象,过程中内存带宽保持满负载运行,温度与功耗平稳。
3.检查测试时间周期内系统日志,无异常。
关联URL:
Fossies(The Fresh Open Source Software Archive):https://fossies.org/
FIO github:https://github.com/axboe/fio