Linux 系统由若干主要物理组件组成,如CPU、内存、网卡和存储设备。要有效地管理Linux 环境,您应该能够以合理的精度测量这些资源的 各种指标—每个组件处理多少资源、是否存在瓶颈等。下面我们介绍下linux资源监控有关的一些命令。
查看系统发行版
root@cf0c6032ba2f:/# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
top(cpu)
Cpu(s)这一行提供了当前CPU运行情况的信息:
Cpu(s): 11.4%us, 29.6%sy, 0.0%ni, 58.3%id, 0.7%wa, 0.0%hi, 0.0%si, 0.0%st
us:用户CPU时间 运行非优雅的用户进程所占CPU时间的百分比(优雅,英文“nicing”,是指一个进程允许你根据其他进程更改优先级)。
sy:系统CPU时间 运行内核和内核进程所占CPU时间的百分比。
ni:优雅CPU时间 如果更改过一些进程的优先级,这个指标能够告诉你它们所占CPU时间的百分比。
id:CPU空闲时间 这是你希望具备很高数值的度量指标中的一个。它代表了CPU的空闲时间比。如果系统运行缓慢,但是这个指标特别高,那么你就可以确定问题的原因不是高CPU负载。
wa:I/O等待 这个数字代表了CPU时间用在等待执行I/O操作所占的百分比。当你解决运行缓慢的系统问题的时候,这是一个非常有价值的度量指标,因为如果这个数值很低,那么就能轻松排除磁盘或者网络I/O的问题。
hi:硬件中断 CPU用于处理硬件中断所占时间的百分比。
si:软件中断 CPU用在处理软件中断所占时间的百分比。
st:流逝的时间 如果你正在运行虚拟机,这个度量指标会告诉你虚拟机中执行的其他任务所占CPU时间的百分比。
查看cpu个数
判断Linux服务器CPU情况的依据如下:
具有相同core id的CPU是同一个core的超线程。
具有相同physical id的CPU是同一个CPU封装的线程或核心。
显示物理CPU个数的命令如下所示:
cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
显示每个物理CPU中core的个数(即核数)的命令如下所示:
cat /proc/cpuinfo | grep "cpu cores" | uniq
命令结果显示如下所示: cpu cores : 1
显示逻辑CPU的个数的命令如下所示:
cat /proc/cpuinfo | grep "processor" | wc -l
命令结果显示如下所示: 4 其实大家从这里就可以看出来,按理说应有如下等式: 物理CPU个数×核数=逻辑CPU的个数 如果不相等的话,则表示你的服务器CPU支持超线程技术。我们在配置服务器的应用时,应以服务器的逻辑CPU个数为准。
uptime(平均负载)
有时候我们会觉得系统响应速度很慢,但是又找不到原因,这时就要查平均负载了,看它是否有大量的进程在排队等待。特定时间间隔内运行队列中的平均进程数可以反映系统的繁忙程度,所以我们通常会在自己的网站或系统变慢时第一时间查系统的负载,即CPU的平均负载。究竟应该如何查看平均负载呢?最简单的命令是uptime,如下所示:
uptime
命令显示结果如下:
11:31:11 up 11 days, 19:01, 2 users, load average: 0.02, 0.01, 0.00
目前的主流服务器都是双四核,有相当强悍的CPU,提供一般的应用服务时,不必担心Linux系统的负载。
这里需要注意的是load average的输出值,这三个值的大小一般不能大于系统逻辑CPU的个数,例如,本输出中系统有4个逻辑CPU,如果load average的三个值长期大于4,说明CPU很繁忙,负载很高,可能会影响系统性能,但是偶尔大于4时,不用担心,一般不会影响系统性能。相反,如果load average的输出值小于CPU的个数,则表示CPU还有空闲的,比如本例中的输出,CPU是比较空闲的。
这时候可以结合vmstat命令来判断我们的系统是否过于繁忙,如果确定很繁忙,就要考虑是否更换服务器或增加CPU的个数了。总结如下: 如果r经常大于3或4,且id经常少于50,则表示CPU的负荷很重。
top(mem)
Mem: 1024176k total, 997408k used, 26768k free, 85520k buffers Swap: 1004052k total, 4360k used, 999692k free, 286040k cached
第1行告诉我们有多少物理内存可用、占用了多少内存、空闲多少内存以及缓存了多少内存。第2行为我们提供了相似的信息,交换存储以及Linux文件缓存使用了多少RAM。
想要找出进程到底真正使用了多少RAM,你必须刨除RAM中的文件缓存。正如你所看到的示例代码一样,在已用的997408KB的RAM中,有286040KB的RAM被文件缓存占用,所以这就是说实际上仅使用了711368KB的RAM。 辨别是否耗尽了RAM的一个好方法是查看文件缓存。
如果实际用的内存减去文件缓存的值很大,同时交换存储的值也很高,很可能的确有内存问题。
free -m(内存)
显示的是当前内存的使用情况,m的意思是以M个字节来显示内容,此命令只在Linux系统下有效,在FreeBSD下是没有此命令的。命令显示结果如下所示:
total used free sharedbuffers cached Mem: 3949 1397 2551 0268917 -/+ buffers/cache:211 3737 Swap:8001 0 8001
上述结果中各个参数的详细说明如下:
total:内存总数。
used:已经使用的内存数。
free:空闲的内存数。
shared:多个进程共享的内存总额。
buffers buffer cache和cached page cache:磁盘缓存的大小。
-buffers/cache:(已用)的内存数,即used-buffers-cached。
+buffers/cache:(可用)的内存数,即free + buffers + cached。 由此得出结论,可用内存的计算公式为可用内存=free+buffers+cached 即 2551MB+268MB+917MB=3737MB 注意 上面等式两边的数值并不相等,但这个没关系,-m参数其实是以整数数值来取舍的。大家如果对这个运算结果有怀疑,可以尝试不带-m参数来观看free命令显示的结果,这样就会一目了然了。
可见-buffers/cache反映的是被程序实实在在占用的内存,而+buffers/cache反映的是可以挪用的内存总数。
vmstat(io)
vmstat是一个相当全面的性能分析工具,通过它可以观察系统的进程状态、内存使用情况、虚拟内存的使用情况、磁盘的I/O、中断、上下文切换、CPU的使用情况等性能信息,建议熟练掌握此命令。
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si sobibo incs us sy id wa
2 0 0 519024 74732 460656800 3 9510 27 5 68 0 2 0 0 519664 74732 460656800 0 0 1847 1244 20 17 63 0 1 0 0 517296 74732 460656800 0 284 2092 1617 37 17 47 0 3 0 0 515440 74732 460656800 0 164 1620 718 26 17 57 0
其中:
(1)procs r:等待运行的进程数。 b:处于非中断睡眠状态的进程数。
(2)memory swpd:虚拟内存使用情况(单位:KB)。 free:空闲的内存(单位:KB)。 buff:被用来作为缓存的内存数量(单位:KB)。
(3)swap si:从磁盘交换到内存的交换页数量(单位:KB/s)。 so:从内存交换到磁盘的交换页数量(单位:KB/s)。
(4)io bi:发送到块设备的块数(单位:块/秒)。 bo:从块设备接收到的块数(单位:块/秒)。
(5)system in:每秒的中断数,包括时钟中断。 cs:每秒的环境(上下文)切换次数。 (6)cpu 按CPU的总使用百分比来显示。 us:CPU使用时间。 sy:CPU系统使用时间。 id:闲置时间。
标准情况下r和b值应该为:r<5,b≈0。 如果user%+sys%<70%则表示系统性能较好,如果user%+sys%>=85%或以上,这表示系统性能比较糟糕,这时就要对系统进行全方面检查了。其中: user%表示CPU处在用户模式下的时间百分比。 sys%表示CPU处在系统模式下的时间百分比。
ps auxf(进程)
要查看系统中用户正在运行的所有进程,可以在ps命令后面使用以下选项:
a(表示所有用户)
u(以面向用户的格式显示,或显示拥有每个进程的用户)
x(没有控制tty或终端屏幕的进程,“显示每个进程”的另一种方法)
ps aux
请注意"ps -aux"不同于"ps aux"。POSIX和UNIX的标准要求"ps -aux"打印用户名为"x"的用户的所有进程,以及打印所有将由-a选项选择的过程。如果用户名为"x"不存在,ps的将会解释为"ps aux",而且会打印一个警告。这种行为是为了帮助转换旧脚本和习惯。它是脆弱的,即将更改,因此不应依赖。
要查看进程树,除了使用上一节用过的a、u和x选项,还要加上个f(其名称源于ASCII art forest)选项。
ps auxf
ps -ef(进程)
ps aux是用BSD格式来显示结果.ps -ef是用全格式的System V格式,显示出来就是带全路径的进程名.
一个影响使用的区别是aux会截断command列,而-ef不会。因此当需要结合grep的时候,优先选择-ef命令,避免误判
netstat(网络)
netstat命令的功能是显示网络连接、路由表和网络接口的信息,可以让用户得知目前都有哪些网络连接正在运作。 下面是它的重要参数,以及详细的说明:
-A:显示任何关联的协议控制块的地址。主要用于调试。
-a:显示所有套接字的状态。在一般情况下不显示与服务器进程相关联的套接字。
-i:显示自动配置接口的状态。那些在系统初始引导后配置的接口状态不在输出之列。
-m:打印网络存储器的使用情况。
-n:打印实际地址,而不是对地址的解释或显示主机、网络名之类的符号。
-r:打印路由选择表。
-f address:family会对于给出名字的地址簇打印统计数字和控制块信息。到目前为止,它唯一支持的地址簇是inet。
-I interface:表示只打印给出名字的接口状态。
-p protocol-name:表示只打印给出名字的协议的统计数字和协议控制块信息。
-s:打印每个协议的统计数字。
-t:表示在输出显示中用时间信息代替队列长度信息。
我们用得最多的,也是最习惯的参数有两个,即netstat-an,如下所示:
netstat -an | grep –v unix
lsof(文件)
lsof(list open files)是一个列出当前系统打开文件的工具。在UNIX环境下,任何事物都是以文件的形式存在的,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以像传输控制协议(TCP)和用户数据报协议(UDP)套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符都会为应用程序与基础操作系统之间的交互提供通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序的信息,因此通过lsof工具查看这个列表对系统监测,以及排错非常有帮助。顺便提一下,这工具首先出现在UNIX系统中,后才移植到Linux平台下。
工作中用得最多的是-i参数,可以用它来查看特定端口的情况,比如,我可以用lsof -i:22查看22端口是由哪些程序占用的。
fdisk -l(硬盘分区)
查看硬盘及分区信息,如下所示: fdisk –l 命令显示结果如下:
Disk /dev/sda: 160.0 GB, 160040803840 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 13 104391 83 Linux / /dev/sda2 14320025599577+ 83 Linux /dev/sda332013582 3068415 82 Linux swap / Solaris /dev/sda43583 19457 127515937+ 5 Extended /dev/sda53583 19457 127515906 83 Linux
以上结果表明这是一块160GB的服务器硬盘。
df(硬盘空间)
检查文件系统的磁盘空间占用情况,命令如下所示:
df –h 命令显示结果如下:
FilesystemSize Used Avail Use% Mounted on /dev/sda2 24G 5.9G 17G 26% /
/dev/sda5 118G 8.8G 103G 8% /data
/dev/sda1 99M 20M 75M 21% /boot
tmpfs 859M 0 859M 0% /dev/shm
du(目录大小)
查看Linux系统中某目录的大小,这在工作中经常会遇到。可以使用如下命令查看:
du -sh 目录名
例如du -sh /data 命令显示结果如下所示: 8.6G /data/ 检查是否有分区使用率(Use%)过高(比如超过90%),如发现某个分区空间接近用完,可以进入该分区的挂载点,用以下命令找出占用空间最多的文件或目录,然后按照从大到小的顺序,正好可以找出系统中占用最多空间的前十个文件或目录:
du -sh * | sort -hr | head -n 10
doc