1. lsof - 列出打開的文件 在許多Linux或者類Unix系統里都有lsof命令,它常用於以列表的形式顯示所有打開的文件和進程。打開的文件包括磁碟文件、網路套接字、管道、設備和進程。使用這條命令的主要情形之一就是在無法掛載磁碟和顯示正在使用或者打開某個文件的錯誤信息的時候。 常用的參數列表: ...
引言
對於系統和網路管理員來說每天監控和調試Linux系統的性能問題是一項繁重的工作。這些命令行工具可以在各種Linux系統下使用,可以用於監控和查找產生性能問題的原因。這個命令行工具列表提供了足夠的工具,您可以挑選適用於您的監控場景的工具。
1. lsof - 列出打開的文件
在許多Linux或者類Unix系統里都有lsof命令,它常用於以列表的形式顯示所有打開的文件和進程。打開的文件包括磁碟文件、網路套接字、管道、設備和進程。使用這條命令的主要情形之一就是在無法掛載磁碟和顯示正在使用或者打開某個文件的錯誤信息的時候。
常用的參數列表: lsof filename 顯示打開指定文件的所有進程lsof -a 表示兩個參數都必須滿足時才顯示結果
lsof -c string 顯示COMMAND列中包含指定字元的進程所有打開的文件
lsof -u username 顯示所屬user進程打開的文件
lsof -g gid 顯示歸屬gid的進程情況
lsof +d /DIR/ 顯示目錄下被進程打開的文件
lsof +D /DIR/ 同上,但是會搜索目錄下的所有目錄,時間相對較長
lsof -d FD 顯示指定文件描述符的進程
lsof -n 不將IP轉換為hostname,預設是不加上-n參數
lsof -i 用以顯示符合條件的進程情況 查看22埠現在運行的情況
[root@CentOS7 ~]# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 925 root 3u IPv4 18374 0t0 TCP *:ssh (LISTEN) sshd 925 root 4u IPv6 18383 0t0 TCP *:ssh (LISTEN) sshd 9452 root 3u IPv4 1169003 0t0 TCP CentOS7.2:ssh->192.168.56.1:61347 (ESTABLISHED)查看所屬root用戶進程所打開的文件類型為txt的文件
[root@CentOS7 ~]# lsof -a -u root -d txt COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root txt REG 0,34 1489960 56083 /usr/lib/systemd/systemd kthreadd 2 root txt unknown /proc/2/exe ksoftirqd 3 root txt unknown /proc/3/exe migration 7 root txt unknown /proc/7/exe rcu_bh 8 root txt unknown /proc/8/exe
2. top - 進程活動
top提供一個當前運行系統實時動態的視圖,也就是正在運行進程。在預設情況下,顯示系統中CPU使用率最高的任務,並每5秒鐘刷新一次。常用熱鍵
top - 11:20:12 up 2 days, 18:39, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.3/0.7 1[| ] KiB Mem : 500780 total, 13236 free, 249296 used, 238248 buff/cache KiB Swap: 8388604 total, 7848788 free, 539816 used. 200108 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 17166 root 20 0 0 0 0 S 0.3 0.0 0:09.05 kworker/0:2 19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:02.25 top 23944 root 20 0 1239128 38724 8388 S 0.3 7.7 6:39.63 firefox 1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:02.22 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 7:11.69 ksoftirqd/0 7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcuob/0 10 root 20 0 0 0 0 S 0.0 0.0 6:09.07 rcu_sched 11 root 20 0 0 0 0 S 0.0 0.0 14:11.36 rcuos/0 12 root rt 0 0 0 0 S 0.0 0.0 0:03.03 watchdog/0 13 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 khelper 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs 15 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns 16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 perfm:顯示記憶體信息開關
top - 11:22:12 up 2 days, 18:41, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 173 total, 1 running, 172 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 60.0/500780 [|||||||||||||||||||||||||||||||||||||||||||||| ] KiB Swap: 6.4/8388604 [||||| ]A:分類顯示系統不同資源的使用大戶,有助於快速識別系統中資源消耗多的任務
1:Def - 11:23:40 up 2 days, 18:42, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 174 total, 1 running, 173 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.7 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 500780 total, 21124 free, 249376 used, 230280 buff/cache KiB Swap: 8388604 total, 7848788 free, 539816 used. 200072 avail Mem 1 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 920 root 20 0 644044 11096 3360 S 0.3 2.2 10:28.34 daomonit 19196 root 20 0 146144 2056 1420 R 0.3 0.4 0:03.00 top 1 root 20 0 191492 4212 2328 S 0.0 0.8 0:27.20 systemd 2 PID PPID TIME+ %CPU %MEM PR NI S VIRT RES UID COMMAND 24416 2 0:03.29 0.0 0.0 0 -20 S 0 0 0 kworker/0:2H 24365 1 0:00.04 0.0 0.3 20 0 S 238724 1380 0 gvfsd-metadata 23944 23598 6:40.25 0.0 7.7 20 0 S 1239128 38724 0 firefox 3 PID %MEM VIRT RES CODE DATA SHR nMaj nDRT %CPU COMMAND 23598 10.7 1473588 53752 16 746528 8912 26k 0 0.0 gnome-shell 23944 7.7 1239128 38724 108 582752 8388 46k 0 0.0 firefox 18581 3.2 110512 15824 392 12292 3364 23 0 0.0 dhclient 4 PID PPID UID USER RUSER TTY TIME+ %CPU %MEM S COMMAND 536 1 172 rtkit rtkit ? 0:03.06 0.0 0.1 S rtkit-daemon 1 0 0 root root ? 0:27.20 0.0 0.8 S systemd 2 0 0 root root ? 0:02.22 0.0 0.0 S kthreadd 3 2 0 root root ? 7:11.70 0.0 0.0 S ksoftirqd/0f:添加刪除所要顯示欄位
Fields Management for window 1:Def, whose current sort field is PPID Navigate with Up/Dn, Right selects for move then <Enter> or Left commits, 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end! * PID = Process Id GROUP = Group Name TGID = Thread Group Id * USER = Effective User Name PGRP = Process Group Id ENVIRON = Environment vars* PR = Priority TTY = Controlling Tty vMj = Major Faults delta * NI = Nice Value TPGID = Tty Process Grp Id vMn = Minor Faults delta * VIRT = Virtual Image (KiB) SID = Session Id USED = Res+Swap Size (KiB) * RES = Resident Size (KiB) nTH = Number of Threads nsIPC=IPC namespace Inode * SHR = Shared Memory (KiB) P = Last Used Cpu (SMP) nsMNT = MNT namespace Inode * S = Process Status TIME = CPU Time nsNET = NET namespace Inode * %MEM = Memory Usage (RES) SWAP = Swapped Size (KiB) nsPID=PID namespace Inode * TIME+ = CPU Time, hundredths CODE = Code Size (KiB) nsUSER=USER namespace Inode * COMMAND = Command Name/Line DATA = Data+Stack (KiB) nsUTS= UTS namespace Inode * %CPU = CPU Usage nMaj = Major Page Faults PPID = Parent Process pid nMin = Minor Page Faults UID = Effective User Id nDRT = Dirty Pages Count RUID = Real User Id WCHAN = Sleeping in Function RUSER = Real User Name Flags = Task Flags <sched.h> SUID = Saved User Id CGROUPS = Control Groups SUSER = Saved User Name SUPGIDS = Supp Groups IDs GID = Group Id SUPGRPS = Supp Groups Namesr:調整一個正在運行的進程Nice值
PID to renice [default pid = 920]k:結束一個正在運行的進程
PID to signal/kill [default pid = 19156]z:彩色/黑白顯示開關
3. vmstat -系統活動、硬體及系統信息
使用vmstat命令可以得到關於進程、記憶體、記憶體分頁、堵塞IO、traps及CPU活動的信息。 r:表示運行隊列(就是說多少個進程真的分配到CPU),我測試的伺服器目前CPU比較空閑,沒 什麼程式在跑,當這個值超過了CPU數目,就會出現CPU瓶頸了。 這個也和top的負載有關係,一般負載超過了3就比較高,超過了5就高,超過了10就不正常了,伺服器的狀態很危險。top的負載類似每秒的運行隊列。如果 運行隊列過大,表示你的CPU很繁忙,一般會造成CPU使用率很高。 b:表示阻塞的進程,這個不多說,進程阻塞,大家懂的。swpd:虛擬記憶體已使用的大小,如果大於0,表示你的機器物理記憶體不足了,如果不是程式內存泄露的原因,那麼你該升級記憶體了或者把耗記憶體的任務遷移到其他機器。free:空閑的物理記憶體的大小,我的機器記憶體總共8G,剩餘3415M。
buff:Linux/Unix系統是用來存儲,目錄裡面有什麼內容,許可權等的緩存,我本機大概占用300多M cache:cache直接用來記憶我們打開的文件,給文件做緩衝,我本機大概占用300多M(這裡是Linux/Unix的聰明之處,把空閑的物理記憶體的一部分拿來做文件和目錄的緩存,是為了提高程式執行的性能,當程式使用記憶體時,buffer/cached會很快地被使用。) si:每秒從磁碟讀入虛擬記憶體的大小,如果這個值大於0,表示物理記憶體不夠用或者記憶體泄露了,要查找耗記憶體進程解決掉。我的機器記憶體充裕,一切正常。 so:每秒虛擬記憶體寫入磁碟的大小,如果這個值大於0,同上。
bi:塊設備每秒接收的塊數量,這裡的塊設備是指系統上所有的磁碟和其他塊設備,預設塊大小是1024byte,我本機上沒什麼IO操作,所以一直是0,但是我曾在處理拷貝大量數據(2-3T)的機器上看過可以達到140000/s,磁碟寫入速度差不多140M每秒。 bo:塊設備每秒發送的塊數量,例如我們讀取文件,bo就要大於0。bi和bo一般都要接近0,不然就是IO過於頻繁,需要調整。 in:每秒CPU的中斷次數,包括時間中斷
cs:每秒上下文切換次數,例如我們調用系統函數,就要進行上下文切換,線程的切換,也要進程上下文切換,這個值要越小越好,太大了,要考慮調低線程或者進程的數目,例如在apache和nginx這種web伺服器中,我們一般做性能測試時會進行幾千併發甚至幾萬併發的測試,選擇web伺服器的進程可以由進程或者線程的峰值一直下調,壓測,直到cs到一個比較小的值,這個進程和線程數就是比較合適的值了。系統調用也是,每次調用系統函數,我們的代碼就會進入內核空間,導致上下文切換,這個是很耗資源,也要儘量避免頻繁調系統函數。上下文切換次數過多表示你的CPU大部分浪費在上下文切換,導致CPU乾正經事的時間少了,CPU沒有充分利用,是不可取的。 us:用戶CPU時間,我曾經在一個做加密解密很頻繁的伺服器上,可以看到us接近100,r運行隊列達到80(機器在做壓力測試,性能表現不佳)。 sy:系統CPU時間,如果太高,表示系統調用時間長,例如是IO操作頻繁。
id:空閑 CPU時間,一般來說,id + us + sy = 100,一般我認為id是空閑CPU使用率,us是用戶CPU使用率,sy是系統CPU使用率。 wt:等待IO CPU時間。
[root@CentOS7 ~]# vmstat -m Cache Num Total Size Pages fuse_inode 10 10 768 10 nf_conntrack_ffff88001a2d8000 0 0 320 12 nf_conntrack_ffffffff81a25e00 180 180 320 12 kcopyd_job 0 0 3312 9 dm_uevent 0 0 2608 12 dm_rq_target_io 0 0 136 30每隔3秒5次:
1 [root@CentOS7 ~]# vmstat 3 5 2 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- 3 r b swpd free buff cache si so bi bo in cs us sy id wa st 4 0 0 539680 17040 8 234828 508 252 7085 420 84 176 6 4 86 4 0 5 0 0 539680 17040 8 234828 0 0 0 0 29 53 0 0 100 0 0 6 1 0 539680 17040 8 234828 0 0 0 0 31 58 0 0 100 0 0 7 0 0 539680 17008 8 234828 0 0 0 0 34 67 0 0 100 0 0 8 1 0 539680 16668 8 234828 0 0 0 0 71 151 1 2 97 0 0
4. w - 顯示誰已登錄
w命令顯示系統當前用戶及其運行進程的信息。[root@CentOS7 ~]# w root 12:26:14 up 2 days, 19:45, 3 users, load average: 0.05, 0.12, 0.13 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root :0 :0 Sat23 ?xdm? 1:08m 0.65s gdm-session-worker [pam/gdm-password] root pts/0 192.168.56.1 Sun22 4:35m 0.61s 0.00s lsof root pts/1 192.168.56.1 11:09 6.00s 0.20s 0.01s w root
5. uptime - 告訴系統已經運行了多久
uptime命令過去只顯示系統運行多久。現在,可以顯示系統運行多久、當前有多少的用戶登錄、在過去的1,5,15分鐘里平均負載時多少。[root@CentOS7 ~]# uptime 12:30:39 up 2 days, 19:49, 3 users, load average: 0.06, 0.08, 0.12何為系統負載呢?
系統平均負載被定義為在特定時間間隔內運行隊列中的平均進程樹。如果一個進程滿足以下條件則其就會位於運行隊列中:
它沒有在等待I/O操作的結果
它沒有主動進入等待狀態(也就是沒有調用'wait')
沒有被停止(例如:等待終止)
一般來說,每個CPU內核當前活動進程數不大於3,則系統運行表現良好!當然這裡說的是每個cpu內核,也就是如果你的主機是四核cpu的話,那麼只要uptime最後輸出的一串字元數值小於12即表示系統負載不是很嚴重。當然如果達到20,那就表示當前系統負載非常嚴重。
6. ps - 顯示進程
Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要動態的顯示進程信息,就可以使用top命令。要對進程進行監測和控制,首先必須要瞭解當前進程的情況,也就是需要查看當前進程,而 ps 命令就是最基本同時也是非常強大的進程查看命令。使用該命令可以確定有哪些進程正在運行和運行的狀態、進程是否結束、進程有沒有僵死、哪些進程占用了過多的資源等等。總之大部分信息都是可以通過執行該命令得到的。
ps為我們提供了進程的一次性的查看,它所提供的查看結果並不動態連續的;如果想對進程時間監控,應該用 top 工具。 linux上進程有5種狀態:
1. 運行(正在運行或在運行隊列中等待)
2. 中斷(休眠中, 受阻, 在等待某個條件的形成或接受到信號) 3. 不可中斷(收到信號不喚醒和不可運行, 進程必須等待直到有中斷發生) 4. 僵死(進程已終止, 但進程描述符存在, 直到父進程調用wait4()系統調用後釋放) 5. 停止(進程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信號後停止運行運行) ps工具標識進程的5種狀態碼:
D 不可中斷 uninterruptible sleep (usually IO)
R 運行 runnable (on run queue) S 中斷 sleeping T 停止 traced or stopped Z 僵死 a defunct (”zombie”) process [root@linux ~]# ps aux [root@linux ~]# ps -lA [root@linux ~]# ps axjf 參數: -A :所有的 process 均顯示出來,與 -e 具有同樣的效用; -a :不與 terminal 有關的所有 process ; -u :有效使用者 (effective user) 相關的 process ; x :通常與 a 這個參數一起使用,可列出較完整信息。 輸出格式規劃: l :較長、較詳細的將該 PID 的的信息列出; j :工作的格式 (jobs format) -f :做一個更為完整的輸出。 特別說明:由於 ps 能夠支持的 OS 類型相當的多,所以他的參數多的離譜!而且有沒有加上 - 差很多!詳細的用法應該要參考 man ps。 例1.將目前屬於您自己這次登入的 PID 與相關信息列示出來
[root@CentOS7 ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 19160 19156 0 80 0 - 29172 wait pts/1 00:00:00 bash 0 R 0 20465 19160 0 80 0 - 34343 - pts/1 00:00:00 ps上面這個信息其實很多,各相關信息的意義為: F:代表這個程式的flag,4代表使用者為super user S:代表這個程式的狀態 PID:這個程式的ID C:CPU 使用的資源百分比 PRI:這個是 Priority (優先執行序) 的縮寫 NI:這個是 Nice 值 ADDR:這個是 kernel function,指出該程式在記憶體的那個部分。如果是個 running的程式,一般就是『 - 』的啦! SZ:使用掉的記憶體大小 WCHAN:目前這個程式是否正在運作當中,若為 - 表示正在運作 TTY:登入者的終端 TIME:使用掉的CPU時間 CMD:所下達的指令 例2.列出目前所有的正在記憶體當中的程式
[root@CentOS7 ~]# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.8 191492 4300 ? Ss May20 0:28 /usr/lib/systemd/systemd root 2 0.0 0.0 0 0 ? S May20 0:02 [kthreadd] root 3 0.1 0.0 0 0 ? S May20 7:12 [ksoftirqd/0] root 7 0.0 0.0 0 0 ? S May20 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S May20 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? S May20 0:00 [rcuob/0] root 10 0.1 0.0 0 0 ? S May20 6:10 [rcu_sched] root 11 0.3 0.0 0 0 ? S May20 14:13 [rcuos/0] root 12 0.0 0.0 0 0 ? S May20 0:03 [watchdog/0] root 13 0.0 0.0 0 0 ? S< May20 0:00 [khelper] root 14 0.0 0.0 0 0 ? S May20 0:00 [kdevtmpfs] root 15 0.0 0.0 0 0 ? S< May20 0:00 [netns] root 16 0.0 0.0 0 0 ? S< May20 0:00 [perf]USER:該 process 屬於那個使用者賬號的 PID :該 process 的號碼 %CPU:該 process 使用掉的 CPU 資源百分比 %MEM:該 process 所占用的物理記憶體百分比 VSZ :該 process 使用掉的虛擬記憶體量 (Kbytes) RSS :該 process 占用的固定的記憶體量 (Kbytes) TTY :該 process 是在那個終端機上面運作,若與終端機無關,則顯示 ?,另外, tty1-tty6 是本機上面的登入者 程式,若為 pts/0 等等的,則表示為由網路連接進主機的程式 STAT:該程式目前的狀態,主要