对于Linux 环境,top
命令是使用频繁且信息较全的命令, 它对于所有正在运行的进行和系统负荷提供实时更新的概览信息。stress
是个简单且全面的性能测试工具。通过它可以模拟各种高负载情况。
通过top
与stress
这两个命令的结合使用,基本可以达到压力测试的目的。
1. 查看硬件资源
# 查看cpu个数
cat /proc/cpuinfo# 查看内存大小
cat /proc/meminfo# 查看当前内存使用情况
free -h# 查看磁盘大小
df -h# 查看当前文件夹已用磁盘大小
du -sh ./*
2. 查看资源实时使用率——top命令
执行top
命令
2.1 第一行
top - 03:13:05 up 7 days, 1:29, 4 users, load average: 0.85,0.67.0.57
- top: 当前时间
- up: 机器运行了多长时间
- users: 当前登录用户数
- load average: 系统负载,即任务队列的平均长度。三个数值分别为 过去的1分钟、5分钟和15分钟里,有多少进程在等待CPU资源。 如果这几个数字高于了CPU核心数(比如在4核CPU上,如果3个数字之和超过了4,就表示负载较大),则说明系统负载较高,需要优化,否则就表示系统运行稳定。
2.2 第二行
Tasks: 182 total, 1 running, 181 sleeping, 0 stopped, 0 zombie
- Tasks: 当前有多少进程。
- running: 正在运行的进程数 。
- sleeping: 正在休眠的进程数 。
- stopped: 停止的进程数 。
- zombie: 僵尸进程数。
2.3 第三行
%Cpu(s):3.6 us, 5.1 sy, 0.0 ni, 91.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
- us:用户空间占CPU的百分比(像shell程序、各种语言的编译器、各种应用、web服务器和各种桌面应用都算是运行在用户地址空间的进程,这些程序如果不是处于idle状态,那么绝大多数的CPU时间都是运行在用户态)。
- sy:内核空间占CPU的百分比(所有进程要使用的系统资源都是由Linux内核处理的,对于操作系统的设计来说,消耗在内核态的时间应该是越少越好,在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,因此在调查IO相关的问题时需要着重关注它)。
- ni:用户进程空间改变过优先级(ni是nice的缩写,可以通过nice值调整进程用户态的优先级,这里显示的ni表示调整过nice值的进程消耗掉的CPU时间,如果系统中没有进程被调整过nice值,那么ni就显示为0)。
- id:空闲CPU占用率。
- wa:等待输入输出的CPU时间百分比(和CPU的处理速度相比,磁盘IO操作是非常慢的,有很多这样的操作,比如,CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的)。
- hi:硬中断占用百分比(硬中断是硬盘、网卡等硬件设备发送给CPU的中断消息,当CPU收到中断消息后需要进行适当的处理,消耗CPU时间)。
- st:软中断占用百分比(软中断是由程序发出的中断,最终也会执行相应的处理程序,消耗CPU时间)。
- st:steal time, 系统花了百分之多少等待得到真正的cpu资源 。
2.4 第四行
KiB Mem :7888320 total, 1695796 free, 4378504 used, 1814020 buff/cache
- total:物理内存总量。
- free:空闲内存量。
- used:使用的内存量。
- buffer/cache:用作内核缓存的内存量。
2.5 第五行
KiB Swap: 8126460 total, 8126460 free, 0 used. 3156100 avail Mem
- total:交换区内存总量。
- free:空闲交换区总量。
- used:使用的交换区总量。
- buffer/cache:缓冲的交换区总量。
第四第五行分别是内存信息和swap信息,所有程序的运行都是在内存中进行的,所以内存的性能对与服务器来说非常重要。不过当内存的free变少的时候,其实我们并不需要太紧张。真正需要看的是Swap中的used信息。
Swap分区是由硬盘提供的交换区,当物理内存不够用的时候,操作系统才会把暂时不用的数据放到Swap中。所以当这个数值变高的时候,说明内存是真的不够用了。
2.6 进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- PID: 进程id
- USER: 进程所有者的用户名
- PR:优先级
- NI: nice值,负值表示高优先级,正值表示低优先级
- VIRT: 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES: 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR: 共享内存大小,单位kb
- S: 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
- %CPU: 上次更新到现在的CPU时间占用百分比
- %MEM: 进程使用的物理内存百分比
- TIME+: 进程使用的CPU时间总计,单位1/100秒
- COMMAND: 命令名/命令行
3. 压力测试工具——stress
3.1 安装
-
在RHEL/CentOS 系统可以使用
yum install stress
-
在Debian/Ubuntu系统中,可以使用
apt-get install stress
-
源码离线安装 stress-1.0.4.tar.gz
tar -zxvf stress-1.0.4.tar.gz
cd stress-1.0.4
./configure
make
make install
3.2 压测命令
帮助命令:stress --help
`stress' imposes certain types of compute stress on your systemUsage: stress [OPTION [ARG]] ...-?, --help show this help statement--version show version statement显示版本号-v, --verbose be verbose显示详细的信息-q, --quiet be quiet程序在运行的过程中不输出信息-n, --dry-run show what would have been done输出程序会做什么而并不实际执行相关的操作-t, --timeout N timeout after N seconds在 N 秒后结束程序--backoff N wait factor of N microseconds before work starts等待N微妙后开始运行-c, --cpu N spawn N workers spinning on sqrt()产生 N 个进程,每个进程都反复不停的计算随机数的平方根-i, --io N spawn N workers spinning on sync()产生 N 个进程,每个进程反复调用 sync() 将内存上的内容写到硬盘上-m, --vm N spawn N workers spinning on malloc()/free()产生 N 个进程,每个进程不断分配和释放内存--vm-bytes B malloc B bytes per vm worker (default is 256MB)指定分配内存的大小--vm-stride B touch a byte every B bytes (default is 4096)不断的给部分内存赋值,让 COW(Copy On Write)发生--vm-hang N sleep N secs before free (default none, 0 is inf)指示每个消耗内存的进程在分配到内存后转入睡眠状态 N 秒,然后释放内存,一直重复执行这个过程--vm-keep redirty memory instead of freeing and reallocating 一直占用内存,区别于不断的释放和重新分配(默认是不断释放并重新分配内存)。-d, --hdd N spawn N workers spinning on write()/unlink()产生 N 个不断执行 write 和 unlink 函数的进程(创建文件,写入内容,删除文件)--hdd-bytes B write B bytes per hdd worker (default is 1GB)指定文件大小Example: stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10sNote: Numbers may be suffixed with s,m,h,d,y (time) or B,K,M,G (size).
stress常用压测命令
# CPU压力测试
# 启动2个CPU进程
stress -c 2
# 启动2个CPU进程,持续时间为60s
stress -c 2 -t 60# 内存压测
# 启动2个进程,每个进程分配1G内存,分配后不释放
stress --vm 2 --vm-bytes 1G --vm-keep# IO压测
# 启动4个进程,将内存上的内容写到硬盘上,top命令可看到sy升高,wa升高
stress -i 4# 磁盘IO压测
# 创建一个进程不断地在磁盘上创建10M大小的文件并写入内容
stress -d 1 --hdd-bytes 10M