常见Linux调优命令和工具

引言:

应同学的要求,分享些基础的知识。

没有比Linux更基础了,关键问题来了,你真的认真看了和转发了吗?

O(∩_∩)O哈哈~

要实现对Linux的调优,就需要用到一些Linux系统命令和工具来观察与监控系统的性能。下面介绍几个最常用的Linux调优命令和工具。

1. top命令

top命令经常用来监控Linux的系统状态,如CPU、内存的使用情况。下面通过一个运行中的Web服务器的top监控截图,讲述top视图中各种数据的含义,以及视图中各进程(任务)的字段的排序。

top进入视图,如图4.17所示。

图4.17

下面结合该视图讲解各个数据的含义。

  • 第一行:10:01:23——当前系统时间;126 days,14:29——系统已经运行了126天14小时29分钟(在这期间没有重启过);2 users——当前有两个用户登录系统;load average:1.15,1.42,1.44——load average后面的3个数分别是1分钟、5分钟、15分钟的负载情况。load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5,则表明系统正在超负荷运转。
  • 第二行:Tasks——任务(进程),系统现在共有183个进程,其中处于运行状态的有1个,182个正在休眠(sleep),处于stopped状态的有0个,处于zombie(僵尸)状态的有0个。
  • 第三行:CPU状态。6.7% us——用户空间占用CPU的百分比;0.4% sy——内核空间占用CPU的百分比;0.0% ni——改变过优先级的进程占用CPU的百分比;92.9% id——空闲CPU百分比;0.0% wa——I/O等待占用CPU的百分比;0.0% hi——硬中断(Hardware IRQ)占用CPU的百分比;0.0% si——软中断(Software Interrupts)占用CPU的百分比。
  • 第四行:内存状态。8306544k total——物理内存总量(8GB);7775876k used——使用中的内存总量(7.7GB);530668k free——空闲内存总量(530MB);79236k buffers——缓存的内存量(79MB)。
  • 第五行:Swap交换分区。2031608k total——交换区总量(2GB);2556k used——使用的交换区总量(2.5MB);2029052k free——空闲交换区总量(2GB);4231276k cached——缓冲的交换区总量(4GB)。 这里需要说明的是,不能用Windows的内存概念理解这些数据,如果按Windows的方式,则此台服务器“危矣”:8GB的内存总量只剩下530MB的可用内存。Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只简单说一些和传统概念(Windows)的区别。第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存并非都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在Linux上free内存会越来越少,但不用为此担心。如果出于习惯去计算可用内存数,这里有一个近似的计算公式:第四行的free+第四行的buffers+第五行的cached。依照这个公式,此台服务器的可用内存为:530668+79236+4231276=4.7GB。 对于内存监控,在top里我们要时刻监控第五行Swap交换分区的used,如果这个数值在不断地变化,则说明内核在不断进行内存和Swap的数据交换,这表示真正的内存不够用了。
  • 第六行是空行。
  • 第七行以下:各进程(任务)的状态监控。PID——进程ID;USER——进程所有者;PR——进程优先级;NI——nice值,负值表示高优先级,正值表示低优先级;VIRT——进程使用的虚拟内存总量,单位为KB(VIRT=SWAP+RESRES——进程使用的、未被换出的物理内存大小,单位为KB);RES=CODE+DATASHR——共享内存大小,单位为KB;S——进程状态(D=不可中断的睡眠状态;R=运行;S=睡眠;T=跟踪/停止;Z=僵尸进程);%CPU——上次更新到现在的CPU时间占用百分比;%MEM——进程使用的物理内存百分比;TIME+——进程使用的CPU时间总计,单位为1/100秒;COMMAND——进程名称(命令名/命令行)。

多核CPU监控:

在top基本视图中,按键盘数字“1”,即可监控每个逻辑CPU的状态,如图4.18所示。

图4.18

观察图4.18,服务器有16个逻辑CPU,实际上是4个物理CPU。

进程字段排序:在进入top时,各进程默认是按照CPU的占用量来排序的,在【top视图01】中进程ID为14210的Java进程排在第一位(CPU占用100%),进程ID为14183的Java进程排在第二位(CPU占用12%)。

可通过键盘指令来改变排序字段。比如,想监控哪个进程占用MEM最多,方法如下:按“b”键(打开/关闭加亮效果),top视图变化如图4.19所示。

图4.19

我们发现进程ID为10704的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(running)的那个进程,可以通过按“y”键关闭或打开运行态进程的加亮效果。

按“x”键(打开/关闭排序列的加亮效果),top视图变化如图4.20所示。

图4.20

可以看到,top默认的排序列是“%CPU”。通过按“Shift+>”或“Shift+<”组合键可以向右或向左改变排序列。图4.21是按一次“Shift+>”组合键的效果图。

图4.21

视图现在已经按照%MEM来排序了。

按“f”键,top进入另一个视图,在这里可以编辑基本视图中的显示字段,如图4.22所示。

这里列出了所有可在top基本视图中显示的进程字段,有“*”并且标注为大写字母的字段是可显示的,没有“*”并且标注为小写字母的字段是不显示的。如果要在基本视图中显示“CODE”和“DATA”两个字段,可以分别按“r”和“s”键。

图4.22

按回车键返回基本视图,可以看到多了“CODE”和“DATA”两个字段,如图4.23所示。

图4.23

top命令是Linux上进行系统监控的首选命令,但有时却达不到我们的要求,如当前这台服务器,top监控就有很大的局限性。top命令的监控最小单位是进程,所以看不到我们关心的Java线程数和客户连接数,而这两个指标是Java的Web服务非常重要的指标,通常可以用ps和netstat两个命令来补充top命令的不足。

监控Java线程数:

ps -eLf|grep java|wc -l

监控网络客户连接数:

netstat -n|grep tcp|grep侦听端口|wc -l

上述两个命令可改变grep的参数来达到更细致的监控要求。在Linux系统“一切都是文件”的思想贯彻指导下,所有进程的运行状态都可以用文件来获取。在系统根目录/proc中,每个数字子目录的名字都是运行中的进程的PID,进入任一个进程目录,都可以通过其中的文件或目录来观察进程的各项运行指标,例如,task目录就是用来描述进程中的线程的,因此,也可以通过下面的方法来获取某进程中运行的线程数量(PID指的是进程ID):

ls /proc/PID/task|wc -l

在Linux中还有一个命令pmap,可以用来输出进程内存的状态,也可以用来分析线程堆栈,如下:

pmap PID

2. vmstat命令[2]

vmstat命令用来获取有关进程、虚拟内存、页面交换空间及CPU活动的信息,这些信息反映了系统的负载情况。

在系统中运行的每个进程都需要使用内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存时,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次被调用,并将释放出来的内存提供给有需要的进程使用。

在Linux内存管理中,主要通过“调页(Paging)”和“交换(Swapping)”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面交换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。

分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。

当系统内核发现可运行内存减少时,就会通过Page-Out来释放一部分物理内存。尽管Page-Out不经常发生,但是如果Page-Out频繁地发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能就会急剧下降。这时的系统运行已经非常缓慢或进入暂停状态,这种状态也被称作Thrashing(颠簸)。

① vmstat命令的使用方法

vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

各参数的含义如下。

-a:显示活跃和非活跃内存。

-f:显示从系统启动至今的fork进程数量。

-m:显示/proc/slabinfo。

-n:只在开始时显示一次各字段名称。

-s:显示内存相关统计信息及多种系统活动数量。

delay:刷新时间间隔。如果不指定,则只显示一条结果。

count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷次。

-d:显示磁盘相关统计信息。

-p:显示指定磁盘分区统计信息。

-S:使用指定单位显示。参数有k、K、m、M,分别代表1000、1024、1 000 000、1 048 576字节(Byte)。默认单位为K(1024Bytes)。

-V:显示vmstat版本信息。

② 字段含义说明

字段含义说明如表4.1所示。

表4.1

类 别

项 目

含 义

说 明

Procs(进程)

r

等待执行的任务数

显示了正在执行和等待CPU资源的任务个数。当这个值超过CPU个数时,就会出现CPU瓶颈

b

置于等待队列(等待资源,等待输入/输出)的内核线程数目

Memory(内存)

swpd

正在使用的虚拟内存大小,单位为k

free

空闲内存大小

buff

已用的buff大小,对块设备的读/写进行缓冲

cache

已用的cache大小,文件系统的cache

inact

非活跃内存大小,即被标明可回收的内存,区别于free和active

具体含义见概念补充(当使用-a选项时显示)

active

活跃的内存大小

具体含义见概念补充(当使用-a选项时显示)

pi

从调页空间调度进的页面

po

调出到调页空间的页面

Swap

si

每秒从交换区写入内存的大小(单位为kbit/s)

so

每秒从内存写到交换区的大小

I/O

bi

每秒读取的块数(读磁盘)

现在的Linux版本,块的大小为1024Bytes

bo

每秒写入的块数(写磁盘)

system

in

每秒中断数,包括时钟中断

这两个值越大,看到的由内核消耗的CPU时间会越多

cs

每秒上下文切换数

CPU(以百分比表示)

us

用户进程执行消耗CPU时间(usertime)

us的值比较高时,说明用户进程消耗的CPU时间多。但是如果长期超过50%地使用,那么就应该考虑优化程序算法或其他措施了

续表

类 别

项 目

含 义

说 明

CPU(以百分比表示)

sy

系统进程消耗CPU时间(systemtime)

sy的值过高时,说明系统内核消耗的CPU资源多。这个不是良性的表现,我们应该检查原因

Id

空闲时间(包括I/O等待时间)

wa

等待I/O时间

wa过高时,说明I/O等待比较严重。这可能是由于磁盘大量随机访问造成的,也有可能是磁盘的带宽出现瓶颈

③ 常见问题处理

CPU瓶颈判断和解决办法。

(1)如果r经常大于4,且id经常小于40,则表示CPU的负荷很严重。

(2)如果pi、po长期不等于0,则表示内存不足。

(3)如果disk经常不等于0,且在b中的队列大于3,则表示I/O性能不佳。

(4)如果在processes中运行的序列(processr)是连续的,且大于在系统中的CPU个数,则表示系统现在运行比较慢,有很多进程正在等待CPU。

(5)如果r的输出数大于系统中可用CPU个数的4倍,则系统面临CPU资源短缺的问题,或者CPU的速率过低,系统中有很多进程正在等待CPU,造成系统中进程运行过慢。

(6)如果空闲时间(cpu id)持续为0,并且系统时间(cpu sy)是用户时间的两倍(cpu us),则系统面临CPU资源短缺的问题。

解决办法:

当发生以上问题时,请先调整应用程序对CPU的占用情况,使应用程序能够更有效地使用CPU,同时可以考虑增加更多的CPU。关于CPU的使用情况,还可以结合mpstat、ps aux、top、prstat -a等相应的命令来综合考虑关于具体CPU的使用情况,以及哪些进程正在大量占用CPU时间。一般情况下,应用程序的问题会比较大,如一些SQL语句不合理等都会造成这种现象。

内存瓶颈判断和解决办法。

内存的瓶颈是由 scanrate(sr)来决定的。scanrate是通过每秒的时钟算法来进行页扫描的。如果scanrate(sr)连续大于每秒200页,则表示可能存在内存缺陷。同样,page项中的pi和po两栏表示页面每秒调入的页数和每秒调出的页数,如果该值经常为非零值,则也有可能存在内存瓶颈。当然,如果个别的时候不为0,则属于正常的页面调度。这就是虚拟内存的主要原理。

解决办法:

  • 调节applications&servers,使得对内存和cache的使用更加有效。
  • 增加系统的内存。
  • 关于内存的使用情况,还可以结合ps aux、top、prstat -a等相应的命令来综合考虑关于具体内存的使用情况,以及哪些进程正在占用大量的内存。
  • 一般情况下,如果系统显示内存的占用率比较高,但是同时CPU的占用率却很低,则可以考虑有很多应用程序占用了内存而没有释放。这时应该考虑让未占用CPU时间的应用程序或一些后台的程序释放占用的内存。

3. iostat命令[3]

iostat命令可以给我们提供丰富的I/O状态数据。

① 基本使用

$iostat –d –k 1 10

参数-d表示设备(磁盘)的使用状态;-k表示某些以Block为单位的列强制使用Kilobytes为单位;1 10表示数据显示每隔1秒刷新一次,共显示10次。示例代码如下:

$iostat -d -k 1 10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda              39.29        21.14         1.44  441339807   29990031
sda1              0.00         0.00         0.00       1623        523
sda2              1.32         1.43         4.54   29834273   94827104
sda3              6.30         0.85        24.95   17816289  520725244
sda5              0.85         0.46         3.40    9543503   70970116
sda6              0.00         0.00         0.00        550        236
sda7              0.00         0.00         0.00        406          0
sda8              0.00         0.00         0.00        406          0
sda9              0.00         0.00         0.00        406          0
sda10            60.68        18.35        71.43  383002263 1490928140
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda             327.55      5159.18       102.04       5056        100
sda1              0.00         0.00         0.00          0          0

tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。

kB_read/s:每秒从设备读取的数据量;kB_wrtn/s:每秒向设备写入的数据量;kB_read:读取的总数据量;kB_wrtn:写入的总数据量;这些值的单位都为Kilobytes。

在上面的例子中,可以看到磁盘sda及它的各个分区的统计数据,当时统计的磁盘总TPS是39.29,下面是各个分区的TPS(因为是瞬间值,所以总TPS并不严格等于各个分区TPS的总和)。

② -x参数

使用-x参数可以获得更多的统计信息。

iostat -d -x -k 1 10
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.80 31.49   42.51    2.92    21.26     1.46     1.16     0.03    0.79   2.62  10.28
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          2.00  20.00 381.00  7.00 12320.00  216.00  6160.00   108.00    32.31     1.75    4.50   2.17  84.20

rrqm/s:每秒这台设备相关的读取请求有多少被合并了(当系统调用需要读取数据的时候,VFS将请求发送到各个FS,如果FS发现不同的读取请求读取的是相同Block的数据,那么FS会将这些请求合并)。

wrqm/s:每秒这台设备相关的写入请求有多少被合并了。

rsec/s:每秒读取的扇区数。

wsec/s:每秒写入的扇区数。

r/s:每秒读请求。

w/s:每秒写请求。

await:每个I/O请求处理的平均时间(单位是微秒或毫秒)。这里可以理解为I/O的响应时间。一般情况下,系统I/O响应时间应该低于5ms。

%util:在统计时间内所有处理I/O时间除以总统计时间。例如,如果统计间隔为1s,该设备有0.8s在处理I/O,而有0.2s在闲置,那么该设备的%util=0.8/1=80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%,则表示设备已经接近满负荷运行了(当然,如果是多磁盘,即使%util为100%,由于磁盘的并发能力,磁盘使用未必达到瓶颈)。

③ -c参数

iostat命令还可以用来获取CPU部分状态值,如下:

iostat -c 1 10
avg-cpu:  %user   %nice   %sys  %iowait  %idle
1.98    0.00    0.35   11.45   86.22
avg-cpu:  %user   %nice   %sys  %iowait  %idle
1.62    0.00    0.25   34.46   63.67

④ 常见用法

$iostat -d -k 1 10        	#查看TPS和吞吐量信息
iostat -d -x -k 1 10      	#查看设备使用率(%util)、响应时间(await)
iostat -c 1 10            	#查看cpu状态

⑤ 实例分析

$$iostat -d -k 1 |grep sda10
Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sda10            60.72        18.95        71.53  395637647 1493241908
sda10           299.02      4266.67       129.41       4352        132
sda10           483.84      4589.90      4117.17       4544       4076
sda10           218.00      3360.00       100.00       3360        100
sda10           546.00      8784.00       124.00       8784        124
sda10           827.00     13232.00       136.00      13232        136

可以看到,磁盘每秒传输次数平均约为400;每秒磁盘读取约5MB,写入约1MB。

iostat -d -x -k 1
Device:    rrqm/s wrqm/s   r/s   w/s  rsec/s  wsec/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await  svctm  %util
sda          1.56  28.31  7.84 31.50   43.65    3.16    21.82     1.58     1.19     0.03    0.80   2.61  10.29
sda          1.98  24.75 419.80  6.93 13465.35  253.47  6732.67   126.73    32.15     2.00    4.70   2.00  85.25
sda          3.06  41.84 444.90 54.08 14204.08 2048.98  7102.04  1024.49    32.57     2.10    4.21   1.85  92.24

可以看到,磁盘的平均响应时间小于5ms,磁盘使用率大于80%。这说明磁盘响应正常,但是已经很繁忙了。

4. nmon工具使用[4]

前面介绍的都是零散的命令,nmon是分析AIX和Linux性能的免费工具。它综合收集系统的信息,以图形化的形式展现出来,方便系统管理对性能的分析。

① 下载nmon。

根据CPU的类型选择下载相应的版本 ② 初始化nmon工具。

根据不同的平台,初始化对应平台的nmon工具,然后直接运行nmon即可。

直接运行nmon可以实时监控系统资源的使用情况,执行下面的步骤可以展现一段时间内系统资源消耗的报告。

如图4.24所示是直接执行nmon命令实时监控系统资源消耗情况的截图。可以看到,CPU、内存、磁盘和网络的消耗情况都被很直观地展现出来。

图4.24

③ 生成nmon报告。

a. 采集数据:

#nmon - s10 -c60 –f –m /home/

参数解释:

-s10:每10秒采集一次数据。

-c60:采集60次,即采集10分钟的数据。

-f:生成的数据文件名中包含文件创建的时间。

-m:生成的数据文件的存放目录。

这样就会生成一个nmon文件,每10秒更新一次,直到10分钟后。生成的文件名如<hostname>_ 090824_1306.nmon,其中“hostname”是这台主机的名称。

使用nmon -h命令可以查看更多帮助信息。

b. 生成报表,下载nmon analyser(生成性能报告的免费工具)。

将之前生成的nmon数据文件上传到Windows机器中,用Excel打开分析工具nmonanalyserv 33C.xls。单击Excel文件中的“Analyzenmondata”按钮,选择nmon数据文件,这样就会生成一个分析后的结果文件hostname_090824_1306.nmon.xls,用Excel打开生成的文件就可以看到结果。

如果宏不能运行,则需要执行以下操作:工具→宏→安全性→中,然后打开文件并允许运行宏。

如图4.25所示是在测试环境中生成的nmon报告截图,图中画框区域为不同指标的分析报告。

图4.25

c. 自动按天采集数据。

在crontab中增加一条记录:

0 0 * * * root nmon -s300 -c288 -f -m /home/ > /dev/null 2>&1

300288=86 400(秒),正好是一天的数据。

参考文献

  1. 参考http://www.jb51.net/article/40807.htm。 ↑
  2. 参考http://blog.chinaunix.net/uid-22741583-id-3087675.html。 ↑
  3. 参考http://www.orczhou.com/index.php/2010/03/iostat-detail/。 ↑
  4. Nmon性能——分析AIX和Linux性能的免费工具:http://www.ibm.com/developerworks/cn/aix/library/analyze_aix/index.html。Nmon Analyser——生成AIX性能报告的免费工具:http://www.ibm.com/developerworks/cn/aix/library/nmon_analyser/index.html。 ↑

原文发布于微信公众号 - 大数据和云计算技术(jiezhu2007)

原文发表时间:2017-08-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Nginx+FPM结构模型剖析及优化

随着php脚本语言使用的普及,目前webserice服务大部分都在用nginx+(php-fpm)的结构,了解了其工作过程后才可以在各个方面想办法做调整优化和故...

4006
来自专栏后端技术探索

PHP并发IO编程之路

并发IO问题一直是后端编程中的技术挑战,从最早的同步阻塞Fork进程,到多进程/多线程,到现在的异步IO、协程。PHP程序员因为有强大的LAMP框架,对底层方面...

561
来自专栏Java技术栈

一次恐怖的 Java 内存泄漏排查实战

最近在看《深入理解Java虚拟机:JVM高级特性与最佳实践》(第二版)这本书,理论+实践结合,深入浅出,强烈推荐给大家。

1103
来自专栏爱撒谎的男孩

设计模式之代理模式

1384
来自专栏java达人

深入解析Java中Flushable接口的flush方法

今天写这篇文章是为了纪念同事讲得两句话:1、flush =在后面对out使劲的抽一鞭子,并命令“赶紧给我写入,我的水桶太满了”;2、写入数据量不大时,可以考虑不...

3168
来自专栏码洞

服务发现的基本原理

服务发现并没有怎样的高深莫测,它的原理再简单不过。只是市面上太多文章将服务发现的难度妖魔化,读者被绕的云里雾里,顿觉自己智商低下不敢高攀。

452
来自专栏容器云生态

redis超时原因系统性排查

1.计算延迟时间: 使用–latency参数  以下参数表示平均超时时间0.03ms。 redis-cli --latency -h 127.0.0.1 ...

4156
来自专栏编程

java缓存技术总结

一、什么是缓存 1、Cache是高速缓冲存储器 一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问 2、凡是位于速度相差较大的两种硬件/软件之间的,...

1925
来自专栏小狼的世界

Google File System 阅读笔记

今天终于拜读了著名GFS的论文,大体上的设计思路是明白了,复杂的系统,其实用了很多简单的逻辑在里面,下面是记录的一些笔记:

542
来自专栏小怪聊职场

JVM第一篇:一个Java内存泄漏的排查案例

2553

扫描关注云+社区