Perf-linux服务器性能测试

本文详细介绍了Linux服务器性能测试的基础知识,重点关注了使用top命令进行性能监控的方法。阐述了top命令的各个输出指标,如CPU使用率、内存使用情况等,并解释了这些指标的含义和计算原理。同时,讨论了如何分析和处理CPU负载过高、内存使用异常等问题,以及Linux系统中的虚拟内存机制和内存管理。通过理解和应用这些知识,可以帮助运维人员更好地进行服务器性能优化。
摘要由CSDN通过智能技术生成

1.压测基础

  • 数据准备:

  • 压测的环境:

2.压测时关注服务端性能

  • 内存:50%以下

  • CPU:一般小于75%,平均每核CPU的load小于1

  • 网络带宽:

  • 磁盘:

  • IO:

  • 数据库:

  • JVM:小于80%

  • full GC频率:小于半小时一次

  • 响应时间:小于期望值20,30,50,100ms

  • 错误率:低于0.5‰

如何做服务器压测-入门级 - 简书 https://www.jianshu.com/p/0b1f2f3b4bbd 实现一个简单的压测工具_白月光的专栏-CSDN博客_压测工具开发

linux工具超多超好用

工具参考篇 — Linux Tools Quick Tutorial

top命令输出详解

前言

Linux下的top命令我相信大家都用过,自从我接触Linux以来就一直用top查看进程的CPU和MEM排行榜。但是top命令的其他输出结果我都没有了解,这些指标都代表什么呢,什么情况下需要关注呢?以及top命令输出结果的来源数据是什么呢,又是怎么一个计算原理呢?

演示环境

 # uname -a
 Linux VM_1_11_centos 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

top命令

top命令是Linux下常用的性能分析工具,能够实时(默认是3s刷新一次)的显示系统的资源使用情况,以及各种进程的资源使用情况,类似于Windows的任务管理器。

复制代码

 top - 11:00:54 up 54 days, 23:35,  6 users,  load average: 16.32, 18.75, 21.04
 Tasks: 209 total,   3 running, 205 sleeping,   0 stopped,   1 zombie
 %Cpu(s): 29.7 us, 18.9 sy,  0.0 ni, 49.3 id,  1.7 wa,  0.0 hi,  0.4 si,  0.0 st
 KiB Mem : 32781216 total,  1506220 free,  6525496 used, 24749500 buff/cache
 KiB Swap:        0 total,        0 free,        0 used. 25607592 avail Mem 
 ​
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                                  
 23444 root      20   0   15.6g 461676   4704 R 198.0  1.4  11:15.26 python                                                                                                                                                                   
 16729 root      20   0 9725596 240028   4672 R 113.0  0.7   7:48.49 python                                                                                                                                                                   
  3388 root      20   0 6878028 143196   4720 S  82.4  0.4   1:35.03 python       

复制代码

第一行数据相当于uptime命令输出。11:00:54是当前时间,up 54 days,23:55 是系统已经运行的时间,6 users表示当前有6个用户在登录,load average:16.32,18.75,21.04分别表示系统一分钟平均负载,5分钟平均负载,15分钟平均负载。

平均负载

平均负载表示的平均活跃进程数,包括正在running的进程数,准备running(就绪态)的进程数,和处于不可中断睡眠状态的进程数。如果平均负载数刚好等于CPU核数,那证明每个核都能得到很好的利用,如果平均负载数大于核数证明系统处于过载的状态,通常认为是超过核数的70%认为是严重过载,需要关注。还需结合1分钟平均负载,5分钟平均负载,15分钟平均负载看负载的趋势,如果1分钟负载比较高,5分钟和15分钟的平均负载都比较低,则说明是瞬间升高,需要观察。如果三个值都很高则需要关注下是否某个进程在疯狂消耗CPU或者有频繁的IO操作,也有可能是系统运行的进程太多,频繁的进程切换导致。比如说上面的演示环境是一台8核的centos机器,证明系统是长期处于过载状态在运行。

 Tasks: 214 total,   4 running, 209 sleeping,   0 stopped,   1 zombie

第二行的Tasks信息展示的系统运行的整体进程数量和状态信息。214 total 表示系统现在一共有214个用户进程,4 running 表示4个进程正在处于running状态,209 sleeping表示209个进程正处于sleeping状态,0 stopped 表示 0 个进程正处于stopped状态,1 zombie表示 有1个僵尸进程。

僵尸进程

子进程结束时父进程没有调用wait()/waitpid()等待子进程结束,那么就会产生僵尸进程。原因是子进程结束时并没有真正退出,而是留下一个僵尸进程的数据结构在系统进程表中,等待父进程清理,如果父进程已经退出则会由init进程接替父进程进行处理(收尸)。由此可见,如果父进程不作为并且又不退出,就会有大量的僵尸进程,每个僵尸进程会占用进程表的一个位置(slot),如果僵尸进程太多会导致系统无法创建新的进程,因为进程表的容量是有限的。所以当zombie这个指标太大时需要引起我们的注意。下面的进程详细信息中的S列就代表进程的运行状态,Z表示该进程是僵尸进程。

消灭僵尸进程的方法:

1.找到僵尸进程的父进程pid(pstress可以显示进程父子关系),kill -9 pid,父进程退出后init自动会清理僵尸进程。(需要注意的是kill -9并不能杀死僵尸进程)

2.重启系统。

 %Cpu(s): 31.9 us, 30.3 sy,  0.0 ni, 37.0 id,  0.0 wa,  0.0 hi,  0.8 si,  0.0 st

第三行的%Cpu(s)表示的是总体CPU使用情况。

  • us user 表示用户态的CPU时间比例

  • sy system 表示内核态的CPU时间比例

  • ni nice 表示运行低优先级进程的CPU时间比例

  • id idle 表示空闲CPU时间比例

  • wa iowait 表示处于IO等待的CPU时间比例

  • hi hard interrupt 表示处理硬中断的CPU时间比例

  • si soft interrupt 表示处理软中断的CPU时间比例

  • st steal 表示当前系统运行在虚拟机中的时候,被其他虚拟机占用的CPU时间比例。

所以整体的CPU使用率=1-id。当us很高时,证明CPU时间主要消耗在用户代码,需要优化用户代码。sy很高时,说明CPU时间都消耗在内核,要么是频繁的系统调用,要么是频繁的CPU切换(进程切换/线程切换)。wa很高时,说明有进程在进程频繁的IO操作,有可能是磁盘IO,也有可能是网络IO。si很高时,说明CPU时间消耗在处理软中断,网络收发包会触发系统软中断,所以大量的网络小包会导致软中断的频繁触发,典型的SYN Floor会导致si很高。

 KiB Mem : 32781216 total,   663440 free,  7354900 used, 24762876 buff/cache
 KiB Swap:        0 total,        0 free,        0 used. 24771700 avail Mem

第4,5行显示的是系统内存使用情况。单位是KiB。totol 表示总内存,free 表示没使用过的内容,used是已经使用的内存。buff表示用于读写磁盘缓存的内存,cache表示用于读写文件缓存的内存。avail表示可用的应用内存。

Swap原理是把一块磁盘空间或者一个本地文件当成内存来使用。Swap total表示能用的swap总量,swap free表示剩余,used表示已经使用的。这三个值都为0表示系统关闭了swap功能,由于演示环境是一台虚拟机,虚拟机一般都关闭swap功能。

第6行开始往后表示的是具体的每个进程状态:

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND 
  • PID 进程ID

  • USER 进程所有者的用户名,例如root

  • PR 进程调度优先级

  • NI 进程nice值(优先级),越小的值代表越高的优先级

  • VIRT 进程使用的虚拟内存

  • RES 进程使用的物理内存(不包括共享内存)

  • SHR 进程使用的共享内存

  • CPU 进程使用的CPU占比

  • MEM 进程使用的内存占比

  • TIME 进程启动后到现在所用的全部CPU时间

  • COMMAND 进程的启动命令(默认只显示二进制,top -c能够显示命令行和启动参数)

计算原理

在介绍top命令的各项指标计算原理之前,有必要先介绍下Linux下的proc文件系统,因为top命令的各项数据来源于proc文件系统。proc文件系统是一个虚拟的文件系统,是Linux内核和用户的一种通信方式,Linux内核会通过proc文件系统告诉用户现在内核的状态信息,用户也可以通过写proc的方式设置内核的一些行为。与普通文件不同的是,这些proc文件是动态创建的,也是动态修改的,因为内核的状态时刻都在变化。

top显示的CPU指标都是来源于/proc/stat文件信息:

复制代码

 # cat /proc/stat 
 cpu  1151829380 20277 540128095 1909004524 21051740 0 10957596 0 0 0
 cpu0 143829475 3918 67658924 235696976 5168514 0 1475030 0 0 0
 cpu1 144407338 1966 67616825 236756510 3969110 0 1392212 0 0 0
 cpu2 144531920 2287 67567520 238021699 2713175 0 1363460 0 0 0
 cpu3 143288938 2366 67474485 239715220 2223739 0 1356698 0 0 0
 cpu4 143975390 3159 67394206 239494900 1948424 0 1343261 0 0 0
 cpu5 144130685 2212 67538520 239431294 1780756 0 1349882 0 0 0
 cpu6 144009592 2175 67536945 239683876 1668203 0 1340087 0 0 0
 cpu7 143656038 2193 67340668 240204045 1579816 0 1336963 0 0 0

复制代码

第一行代表的总的CPU信息,后面的是一个CPU的详细信息。

但是这些具体的后面的列都是什么信息呢,我们可以通过man proc找到答案:

复制代码

 user   (1) Time spent in user mode.
 ​
 nice   (2) Time spent in user mode with low priority (nice).
 ​
 system (3) Time spent in system mode.
 ​
 idle   (4) Time spent in the idle task.  This value should be USER_HZ times the second  entry  in  the
             /proc/uptime pseudo-file.
 iowait (since Linux 2.5.41)
 ​
          (5) Time waiting for I/O to complete.
 ​
 irq (since Linux 2.6.0-test4)
          (6) Time servicing interrupts.
 ​
 softirq (since Linux 2.6.0-test4)
          (7) Time servicing softirqs.
 ​
 steal (since Linux 2.6.11)
           (8)  Stolen time, which is the time spent in other operating systems when running in a virtual‐
                   ized environment
 ​
 guest (since Linux 2.6.24)
           (9) Time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.
 ​
 guest_nice (since Linux 2.6.33)
            (10)  Time  spent running a niced guest (virtual CPU for guest operating systems under the con‐
                   trol of the Linux kernel).

复制代码

也就是说从第二列开始往后分别是user,nice,system,idle,iowait,irq(硬中断),softirq(软中断),steal,guest,guest_nice的CPU时间,单位通常是10ms。那么top里面的比例又是怎么算出的呢?

由于CPU时间是一个累加值,所以我们要求一个时间段差值来反映当前的CPU情况,top默认是3s。例如现在取一个user值user1,和当前的一个总量的CPU时间total1

其中total等于上面各项相加,也就是total=user+nice+system+idle+iowait+irq+softirq+steal+guest+guest_nice。3秒后再去一个user值user2和一个总量total2。

那么这3秒钟的user平均cpu占比就等于((user2-user1)/ (total2-total1))/ 3 * 100%。另外每个具体的CPU计算方式同理。

top内存相关的指标直接读取/proc/meminfo文件的对应字段:

复制代码

 # cat /proc/meminfo 
 MemTotal:       32781216 kB
 MemFree:         1043556 kB
 MemAvailable:   25108920 kB
 Buffers:          427516 kB
 Cached:         22084612 kB
 SwapCached:            0 kB
 Active:         18640888 kB
 Inactive:       10534920 kB
 Active(anon):    6664480 kB
 Inactive(anon):      412 kB
 Active(file):   11976408 kB
 Inactive(file): 10534508 kB
 Unevictable:           4 kB
 Mlocked:               4 kB
 SwapTotal:             0 kB
 SwapFree:              0 kB
 Dirty:              1092 kB
 Writeback:             0 kB
 AnonPages:       6663764 kB
 Mapped:           347808 kB
 Shmem:              1212 kB
 Slab:            2201292 kB
 SReclaimable:    1957344 kB
 SUnreclaim:       243948 kB
 KernelStack:       73392 kB
 PageTables:        57300 kB
 NFS_Unstable:          0 kB
 Bounce:                0 kB
 WritebackTmp:          0 kB
 CommitLimit:    16390608 kB
 Committed_AS:   42170784 kB
 VmallocTotal:   34359738367 kB
 VmallocUsed:       61924 kB
 VmallocChunk:   34359625048 kB
 HardwareCorrupted:     0 kB
 AnonHugePages:    364544 kB
 HugePages_Total:       0
 HugePages_Free:        0
 HugePages_Rsvd:        0
 HugePages_Surp:        0
 Hugepagesize:       2048 kB
 DirectMap4k:      376680 kB
 DirectMap2M:    26886144 kB
 DirectMap1G:     8388608 kB

复制代码

其中total对应于MemTotal,free 对应于MemFree,avail 对应于MemAailable。

总结

文章从top命令的输出结果开始,说明哪些指标的异常值需要我们关注,最后介绍了top命令的cpu计算原理和mem的数据来源。

iowait 过高问题的查找及解决linux - 思维无界限 - 博客园

首先说说虚拟内存和物理内存:

虚拟内存就是采用硬盘来对物理内存进行扩展,将暂时不用的内存页写到硬盘上而腾出更多的物理内存让有需要的进程来用。当这些内存页需要用的时候在从硬盘读回内存。这一切对于用户来说是透明的。通常在Linux系统说,虚拟内存就是swap分区。在X86系统上虚拟内存被分为大小为4K的页。

每一个进程启动时都会向系统申请虚拟内存(VSZ),内核同意或者拒就请求。当程序真正用到内存时,系统就它映射到物理内存。RSS表示程序所占的物理内存的大小。用ps命令我们可以看到进程占用的VSZ和RSS。

# ps –aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

daemon 2177 0.0 0.2 3352 648 ? Ss 23:03 0:00 /usr/sbin/atd

dbus 2196 0.0 0.5 13180 1320 ? Ssl 23:03 0:00 dbus-daemon-1 --sys

root 2210 0.0 0.4 2740 1044 ? Ss 23:03 0:00 cups-config-daemon

root 2221 0.3 1.5 6108 4036 ? Ss 23:03 0:02 hald

root 2231 0.0 0.1 2464 408 tty1 Ss+ 23:03 0:00 /sbin/mingetty tty1

内核会定期将内存中的数据同步到硬盘,这个过程叫做Memory Paging。同时内核也要负责回收不用的内存,将他们分给其他需要的进程。PFRA算法(Page Frame reclaim algorithm)负责回收空闲的内存。算法根据内存页的类型来决定要释放的内存页。有下列4种类型:

1. Unreclaimable –锁定的,内核保留的页面;

2. Swappable –匿名的内存页;

3. Syncable –通过硬盘文件备份的内存页;

4. Discardable –静态页和被丢弃的页。

除了第一种(Unreclaimable)之外其余的都可以被PFRA进行回收。与之相关的进程是kswapd。在kswapd中,有2个阀值,pages_hige和pages_low。当空闲内存页的数量低于pages_low的时候,kswapd进程就会扫描内存并且每次释放出32个free pages,直到free page的数量到达pages_high。具体kswapd是如何回收内存的呢?有如下原则:

\1. 如果页未经更改就将该页放入空闲队列;

\2. 如果页已经更改并且是可备份回文件系统的,就理解将内存页的内容写回磁盘;

\3. 如果页已经更改但是没有任何磁盘上的备份,就将其写入swap分区。

# ps -ef | grep kswapd

root 30 1 0 23:01 ? 00:00:00 [kswapd0]

在回收内存过程中还有两个重要的方法,一是LMR(Low on memory reclaiming),另一个是OMK(Out of Memory Killer)。当分配内存失败的时候LMR将会其作用,失败的原因是kswapd不能提供足够的空闲内存,这个时候LMR会每次释放1024个垃圾页知道内存分配成功。当LMR不能快速释放内存的时候,OMK就开始其作用,OMK会采用一个选择算法来决定杀死某些进程。当选定进程时,就会发送信号SIGKILL,这就会使内存立即被释放。OMK选择进程的方法如下:

\1. 进程占用大量的内存;

\2. 进程只会损失少量工作;

\3. 进程具有低的静态优先级;

\4. 进程不属于root用户。

进程管理中另一个程序pdflush用于将内存中的内容和文件系统进行同步,比如说,当一个文件在内存中进行修改,pdflush负责将它写回硬盘。

# ps -ef | grep pdflush

root 28 3 0 23:01 ? 00:00:00 [pdflush]

root 29 3 0 23:01 ? 00:00:00 [pdflush]

每当内存中的垃圾页(dirty page)超过10%的时候,pdflush就会将这些页面备份回硬盘。这个比率是可以调节的,通过参数vm.dirty_background_ratio。

# sysctl -n vm.dirty_background_ratio

10

Pdflush同PFRA是独立运行的,当内核调用LMR时,LMR就触发pdflush将垃圾页写回硬盘。

我们来看内存监控的一个例子,用vmstat命令的输出如下:

# vmstat 3 procs memory swap io system cpu r b swpd free buff cache si so bi bo in cs us sy id wa 3 2 809192 261556 79760 886880 416 0 8244 751 426 863 17 3 6 75 0 3 809188 194916 79820 952900 307 0 21745 1005 1189 2590 34 6 12 48 0 3 809188 162212 79840 988920 95 0 12107 0 1801 2633 2 2 3 94 1 3 809268 88756 79924 1061424 260 28 18377 113 1142 1694 3 5 3 88 1 2 826284 17608 71240 1144180 100 6140 25839 16380 1528 1179 19 9 12 61 2 1 854780 17688 34140 1208980 1 9535 25557 30967 1764 2238 43 13 16 28 0 8 867528 17588 32332 1226392 31 4384 16524 27808 1490 1634 41 10 7 43 4 2 877372 17596 32372 1227532 213 3281 10912 3337 678 932 33 7 3 57 1 2 885980 17800 32408 1239160 204 2892 12347 12681 1033 982 40 12 2 46 5 2 900472 17980 32440 1253884 24 4851 17521 4856 934 1730 48 12 13 26 1 1 904404 17620 32492 1258928 15 1316 7647 15804 919 978 49 9 17 25 4 1 911192 17944 32540 1266724 37 2263 12907 3547 834 1421 47 14 20 20 1 1 919292 17876 31824 1275832 1 2745 16327 2747 617 1421 52 11 23 14 5 0 925216 17812 25008 1289320 12 1975 12760 3181 772 1254 50 10 21 19 0 5 932860 17736 21760 1300280 8 2556 15469 3873 825 1258 49 13 24 15

其中:swpd为虚拟内存的使用大小单位为KB.

Free为空闲的物理内存的大小(KB);

Buff为内存中缓存的大小,这些缓存是read()和write()函数使用的(KB);

Cache进程的地址空间在物理内存中的映射(KB);

So为从内存写入swap空间的数据大小(KB);

Si为从swap空间写入内存的数据大小(KB);

Bo为从内存写入硬盘或swap的页数量;

Bi为从硬盘或swap写入内存的页数量;

从上面的输出我们可以看到:

\1. 大量的disk pages(bi)被写入内存,这点可以从cache的不断增长来证明;

\2. 在这个过程中,物理内存始终保持在17MB虽然不断有数据从硬盘读入来消耗内存;

\3. 为了保持可用物理内存,kswapd不断的从Buff中偷取内存,来加入空闲列表,buff不断减小;

\4. 同时kswapd不断的将垃圾页写入swap空间,我们可以看到so和swpd不断增加.

现在我们可以得出结论,这是一个IO Bound的程序,并且造成了虚拟内存的大量使用,加大物理内存可以改善性能.

总结下来:

\1. 当一个系统有越少的页错误(所需数据不在内存,需要从硬盘读入),就会有越好的响应时间.因为内存比硬盘快得多.

\2. Free memory数量低是一个好的征兆,因为证明了cache在起作用,除非同时存在大量的bi和so.

\3. 如果一个系统有持续的si和so,就说明系统的内存是一个瓶颈.

转自:http://blog.163.com/bobile45@126/blog/static/96061992201210101619125/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进阶的小猫

觉得不错就打赏1元鼓励小姐姐呀

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值