Linux下排查问题常用指令(二) - 机器状态相关
接上篇。第一篇说了查看进程状态相关的指令,这一篇来看看查看机器状态相关的指令(相当于windows下的资源管理器)。
相关指令
free
从最简单的开始,查看内存使用的指令:free。示例:
me@iZ94rxjfu2hZ:~$ free -g
total used free shared buffers cached
Mem: 1 1 0 0 0 0
-/+ buffers/cache: 0 0
Swap: 0 0 0
输入-g代表以Gbytes作为单位显示。可以看到这台机的内存已经快用完了。以我了解,这里的Swap字段如果超过0,说明内存已经用完了,操作系统在用Swap技术以磁盘作为虚拟内存使用,这时机器会变得非常慢,一般來說, swap 最好不要被使用。
uname
uname也很简单,可看一些kernel的信息:
me@iZ94rxjfu2hZ:~$ uname -a
Linux iZ94rxjfu2hZ 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
uptime
uptime:觀察系統啟動時間與工作負載。就是顯示出目前系統已經開機多久的時間,以及 1, 5, 15 分鐘的平均負載。
me@iZ94rxjfu2hZ:~$ uptime
09:15:45 up 113 days, 23:34, 1 user, load average: 0.03, 0.03, 0.05
lsof
lsof,list open files的意思。列出被程序所開啟的檔案檔名。它的参数是:
- -a :多項資料需要『同時成立』才顯示出結果時,相当于and。
- -U :僅列出 Unix like 系統的 socket 檔案類型;
- -u :後面接 username,列出該使用者相關程序所開啟的檔案;
- +d :後面接目錄,亦即找出某個目錄底下已經被開啟的檔案!
示例:
列出me用户下的进程使用的文件:
me@iZ94rxjfu2hZ:~$ lsof -u me| head -n 2
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 1390 me cwd DIR 202,1 4096 527145 /home/me/repos/moments
FD、TYPE、DEVICE、NODE这几栏的意义不详,待补充。
netstat
netstat:监控和追踪网络和其他资源的变化。它的一些参数:
- -a :將目前系統上所有的連線、監聽、Socket 資料都列出來
- -t :列出 tcp 網路封包的資料
- -u :列出 udp 網路封包的資料
- -n :不以程序的服務名稱,以埠號 (port number) 來顯示;
- -l :列出目前正在網路監聽 (listen) 的服務;
- -p :列出該網路服務的程序 PID
一个非常好用的指令,可以列出本地正在监听哪些端口,哪些进程在收到请求,示例:
列出正在监听各种端口的所有进程,并列出PID号:
me@iZ94rxjfu2hZ:~$ netstat -tupl
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 *:9090 *:* LISTEN 1458/java
tcp 0 0 *:http *:* LISTEN -
tcp 0 0 *:56789 *:* LISTEN -
tcp6 0 0 [::]:3000 [::]:* LISTEN 1570/node
tcp6 0 0 [::]:3001 [::]:* LISTEN 1513/node
udp 0 0 112.74.28.115:ntp *:* -
udp 0 0 iZ94rxjfu2hZ:ntp *:* -
udp 0 0 localhost:ntp *:* -
udp 0 0 *:ntp *:* -
udp6 0 0 [::]:ntp [::]:* -
这样就可以看到3001端口被一个PID为1513的node进程监听,9090端口被一个PID为1458的java进程监听。
在网络篇再详细介绍下这个指令吧。
vmstat
vmstat:查看机器的输入输出变化,这些输入输出主要有几部分:
- CPU
- 内存
- 硬盘
看看各项都是怎么呈现的:
me@iZ94rxjfu2hZ:~$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 542860 136728 381760 0 0 0 6 4 4 1 1 98 0 0
- procs:进程数。r :等待運作中的程序數量;b:不可被喚醒的程序數量。這兩個項目越多,代表系統越忙碌。
- memory:顾名思义,内存情况。swpd:虛擬記憶體被使用的容量; free:未被使用的記憶體容量; buff:用於緩衝記憶體; cache:用於快取記憶體。
- swap:内存使用swap的IO。si:由磁碟中將程序取出的量; so:由於記憶體不足而將沒用到的程序寫入到磁碟的 swap 的容量。 如果 si/so 的數值太大,表示記憶體內的資料常常得在磁碟與主記憶體之間傳來傳去,系統效能會很差!如果si、so不是一直为0,那说明性能已经出现问题!
- io:磁盘io。
- system:in:每秒被中斷的程序次數; cs:每秒鐘進行的事件切換次數;這兩個數值越大,代表系統與周邊設備的溝通非常頻繁! 這些周邊設備當然包括磁碟、網路卡、時間鐘等。
- cpu:CPU 的項目分別為: us:非核心層的 CPU 使用狀態; sy:核心層所使用的 CPU 狀態; id:閒置的狀態; wa:等待 I/O 所耗費的 CPU 狀態; st:被虛擬機器 (virtual machine) 所盜用的 CPU 使用狀態 (2.6.11 以後才支援)。
iostat
iostat:主要用于监控系统设备的IO负载情况(主要是磁盘),iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。
me@iZ94rxjfu2hZ:~$ iostat
Linux 3.13.0-32-generic (iZ94rxjfu2hZ) 06/11/2017 _x86_64_ (1 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.63 0.08 0.13 98.36
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
xvda 0.57 0.11 5.68 1082365 57503280
- tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。”一次传输”意思是”一次I/O请求”。多个逻辑请求可能会被合并为”一次I/O请求”。”一次传输”请求的大小是未知的。
- kB_read/s:每秒从设备(drive expressed)读取的数据量;
- kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
- kB_read:读取的总数据量;
- kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。
iostat还有一个-x选项,能显示磁盘性能相关的更详尽的信息,但一般情况下应该用不到,先不列出了。
pidstat
其他
包括:ss, sar, mpstat。 linux下相关的命令太多,不需要一一记住,掌握几个就可以了。
参考
- http://linux.vbird.org/linux_basic/0440processcontrol.php
- 《Linux从入门到精通》