12个Linux性能命令对于系统管理员来说是必须了解的

在IT世界中,解决与性能相关的问题总是具有挑战性的,如果你不了解正确的工具,则会变得非常沮丧。

如果你在生产环境中担任支持工作,那么你很可能需要处理与性能相关的问题。让我们来了解一些用于诊断性能相关问题的最常用的Linux命令行实用程序。

注意:下面列出的一些命令可能不会默认安装,所以你需要手动安装它们。

lsof

lsof代表“列出打开的文件”,可帮助你找到所有打开的文件和进程以及打开它们的人。在某些情况下,lsof实用程序非常方便。

列出特定PID打开的所有文件。

# lsof –p PID

统计文件和进程的数量

[root@localhost ~]# lsof -p 4271 | wc -l
34
[root@localhost ~]#

检查当前打开的日志文件

# lsof –p | grep log

查找进程使用的端口号

lsof -i -P |grep $PID
[root@localhost ~]# lsof -i -P |grep 4271

nginx     4271   root   6u IPv4 51306     0t0 TCP *:80 (LISTEN)

nginx     4271   root   7u IPv4 51307     0t0 TCP *:443 (LISTEN)

[root@localhost ~]#

查看更多 lsof command examples

pidstat

pidstat可以用于监视由Linux内核管理的任务。使用此命令可以轻松解决与I/O相关的问题。

列出所有PID的I/O统计信息

# pidstat –d

显示特定PID的I/O统计信息

# pidstat –p 4271 –d

如果你正在进行实时故障排除某个进程,则可以按间隔监视I/O。下面的示例是每5秒监视一次。

[root@localhost ~]# pidstat -p 4362 -d 5

Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain)          08/13/2016             _x86_64_         (2 CPU) 

07:01:30 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s Command

07:01:35 PM     0     4362     0.00     0.00     0.00 nginx

07:01:40 PM     0     4362     0.00     0.00     0.00 nginx

07:01:45 PM     0     4362     0.00     0.00     0.00 nginx

07:01:50 PM     0     4362     0.00     0.00     0.00 nginx

top

可能是Linux上最常用的命令之一就是top。top命令可以用于显示系统摘要信息和当前利用率。

只需执行top命令即可显示CPU利用率,进程详细信息,任务数量,内存利用率,僵尸进程数量等。

顶部-11:48:43 运行时长:13天,17:25,1个用户,平均负载:0.00,0.00,0.00
任务:总计90个,运行中2个,休眠中88个,停止0个,僵尸进程0个
%Cpu(s):0.3 用户态,0.0 系统态,0.0 nice值,99.7 空闲,0.0 等待I/O,0.0 硬中断,0.0 软中断,0.0 虚拟化(stolen)
内存:总计1829.7 MiB,空闲388.1 MiB,已使用220.3 MiB,缓存/缓冲区1221.4 MiB
交换空间:总计0.0 MiB,空闲0.0 MiB,已使用0.0 MiB,可用内存1369.4 MiB

PID 用户 PR NI 虚拟内存 实际内存 共享内存 S %CPU %内存 时间+ 命令
1 root 20 0 186820 13400 9092 S 0.0 0.7 0:10.87 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.13 kthreadd
3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp
4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
6 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kworker/0:0H
8 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 mm_percpu_wq
9 root 20 0 0 0 0 S 0.0 0.0 0:07.35 ksoftirqd/0
10 root 20 0 0 0 0 R 0.0 0.0 0:07.30 rcu_sched
11 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
12 root rt 0 0 0 0 S 0.0 0.0 0:00.50 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
16 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 netns
17 root 20 0 0 0 0 S 0.0 0.0 0:00.68 kauditd
18 root 20 0 0 0 0 S 0.0 0.0 0:00.25 khungtaskd
19 root 20 0 0 0 0 S 0.0 0.0 0:00.00 oom_reaper
20 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 writeback
21 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kcompactd0
22 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
23 root 39 19 0 0 0 S 0.0 0.0 0:05.63 khugepaged
24 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 crypto
25 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kintegrityd
26 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 kblockd

显示特定用户的进程详细信息

# top –u username

要杀死进程,可以执行top命令并按下。它会提示您输入要杀死的PID。

top - 11:49:39 up 13 days, 17:26,  1 user,  load average: 0.00, 0.00, 0.00
Tasks:  91 total,   1 running,  90 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.3 us,  0.0 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1829.7 total,    386.9 free,    221.4 used,   1221.4 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   1368.3 avail Mem 
PID to signal/kill [default pid = 21261] 
  PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                                              
 5834 nginx     20   0  148712   7428   4800 S   0.0   0.4   0:02.37 nginx

ps

ps代表进程状态,是广泛使用的命令,用于获取运行中进程的快照。非常有用以确定一个进程是否正在运行,如果正在运行则打印PID。

通过某个词查找PID和进程详细信息

[root@lab ~]# ps -ef|grep nginx
root      5833     1  0 May24 ?        00:00:00 nginx: master process /usr/sbin/nginx
nginx     5834  5833  0 May24 ?        00:00:02 nginx: worker process
root     21267 18864  0 11:50 pts/0    00:00:00 grep --color=auto nginx
[root@lab ~]#

tcpdump

解决网络问题总是具有挑战性的,而使用tcpdump是其中一个必备的命令。

您可以使用tcpdump来捕获网络接口上的网络数据包。

要在特定的网络接口上捕获数据包

[root@lab ~]# tcpdump -i eth0 -w /tmp/capture
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
^C9 packets captured
16 packets received by filter
0 packets dropped by kernel
[root@lab ~]#

如上所示,已经捕获到了eth0接口上的流量。

要捕获源IP和目标IP之间的网络流量

# tcpdump src $IP and dst host $IP

捕获目标端口为443的网络流量

# tcpdump dst port 443
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes
12:02:30.833845 IP 192.168.1.2.49950 > ec2-107-22-185-206.compute-1.amazonaws.com.https: Flags [.], ack 421458229, win 4096, length 0
12:02:32.076893 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [S], seq 21510813, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 353259990 ecr 0,sackOK,eol], length 0
12:02:32.090389 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [.], ack 790725431, win 8192, length 0
12:02:32.090630 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [P.], seq 0:517, ack 1, win 8192, length 517
12:02:32.109903 IP 192.168.1.2.49953 > 104.25.133.107.https: Flags [.], ack 147, win 8187, length 0

读取捕获的文件

# tcpdump –r filename

例如:要读取上述捕获的文件

# tcpdump –r /tmp/test

了解更多关于tcpdump如何捕获和分析网络流量的信息。

iostat

iostat代表输入输出统计,常用于诊断存储设备的性能问题。您可以使用iostat监视CPU、设备和网络文件系统的利用率报告。

显示磁盘I/O统计信息

[root@localhost ~]# iostat -d
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 08/13/2016 _x86_64_ (2 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.82 55.81 12.63 687405 155546
[root@localhost ~]#

显示CPU统计信息

[root@localhost ~]# iostat -c
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain) 08/13/2016 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.59 0.02 0.33 0.54 0.00 98.52
[root@localhost ~]#

ldd

ldd的全称是list dynamic dependencies,用于显示库所需的共享库。ldd命令对于诊断应用程序启动问题很有用。

如果某个程序由于依赖项不可用而无法启动,可以使用ldd查找它所需要的共享库。

[root@localhost sbin]# ldd httpd
            linux-vdso.so.1 => (0x00007ffe7ebb2000)
            libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa4d451e000)
            libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fa4d42f9000)
            libaprutil-1.so.0 => /lib64/libaprutil-1.so.0 (0x00007fa4d40cf000)
            libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fa4d3e98000)
            libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fa4d3c6e000)
            libdb-5.3.so => /lib64/libdb-5.3.so (0x00007fa4d38af000)
            libapr-1.so.0 => /lib64/libapr-1.so.0 (0x00007fa4d3680000)
            libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa4d3464000)
            libdl.so.2 => /lib64/libdl.so.2 (0x00007fa4d325f000)
            libc.so.6 => /lib64/libc.so.6 (0x00007fa4d2e9e000)
            liblzma.so.5 => /lib64/liblzma.so.5 (0x00007fa4d2c79000)
            /lib64/ld-linux-x86-64.so.2 (0x00007fa4d4a10000)
            libuuid.so.1 => /lib64/libuuid.so.1 (0x00007fa4d2a73000)
            libfreebl3.so => /lib64/libfreebl3.so (0x00007fa4d2870000)
[root@localhost sbin]#

netstat

netstat(网络统计)是一个用于打印网络连接、接口统计和故障排除各种与网络相关问题的流行命令。

显示所有协议的统计信息

# netstat –s

您可以使用grep查找是否有任何错误

[root@localhost sbin]# netstat -s | grep error
   0 packet receive errors
   0 receive buffer errors
   0 send buffer errors
[root@localhost sbin]#

显示内核路由表

[root@localhost sbin]# netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window irtt Iface
default         gateway         0.0.0.0         UG       0 0         0 eno16777736
172.16.179.0   0.0.0.0         255.255.255.0   U         0 0         0 eno16777736
192.168.122.0   0.0.0.0         255.255.255.0   U         0 0         0 virbr0
[root@localhost sbin]#

了解更多 netstat command examples.

free

如果您的Linux服务器的内存不足或只想查看可用内存中有多少内存可用,则可以使用free命令。

[root@localhost sbin]# free -g
             total       used       free     shared buff/cache   available
Mem:              5           0           3           0           1           4
Swap:             5           0           5
[root@localhost sbin]#

-g表示以GB为单位显示详细信息。因此,可以看到总可用内存为5GB,剩余3GB。

sar

sar(系统活动报告)对于收集一些报告非常有用,包括CPU、内存和设备负载。

只需执行sar命令,即可显示整天的系统利用率。

默认情况下,它以10分钟为单位存储利用率报告。如果您需要更短的实时报告,则可以使用如下命令。

每3秒钟显示3次CPU报告

将英文翻译成简体中文,保留,及HTML标签。

[root@localhost sbin]# sar 3 2
Linux 3.10.0-327.13.1.el7.x86_64 (localhost.localdomain)          08/13/2016             _x86_64_         (2 CPU)
11:14:02 PM     CPU     %user     %nice   %system   %iowait   %steal     %idle
11:14:05 PM     all     1.83     0.00     0.50     0.17     0.00     97.51
11:14:08 PM     all     1.50     0.00      0.17     0.00     0.00     98.33
Average:       all     1.67     0.00     0.33     0.08     0.00     97.92
[root@localhost sbin]#

Show Memory usage report

# sar -r

Show network report

# sar -n ALL

ipcs

ipcs (InterProcess Communication System) 提供了关于信号量,共享内存和消息队列的报告。

列出消息队列

# ipcs -q

列出信号量

# ipcs -s

列出共享内存

# ipcs -m

显示IPC的当前使用状态

[root@localhost sbin]# ipcs -u

------ Messages Status --------
allocated queues = 0
used headers = 0
used space = 0 bytes

------ Shared Memory Status --------
segments allocated 5
pages allocated 2784
pages resident 359
pages swapped   0
Swap performance: 0 attempts       0 successes

------ Semaphore Status --------
used arrays = 0
allocated semaphores = 0
[root@localhost sbin]#

ioping

ioping是一个外部命令,您可以从here安装它。它可以实时监测磁盘I/O延迟,非常有用。

结论

我希望以上命令能在您的工作中的各种情况下有所帮助。以上命令是按需使用的。然而,如果您需要始终监控Linux服务器,那么您应该考虑使用server monitoring software

另外,要了解更多关于Linux性能的信息,您可以查看这个Udemy course

类似文章