眾所周知,生病了需要去醫院看病,大夫首先要詢問我們哪里不舒服,然后再通過觀察和自己的經驗,大體上就能判定我們得的是什么病。然而Linux不會說話,它不會主動告訴我們哪里出現了問題,需要我們自己去觀察。那么如何評估系統運行狀態是否良好呢?下面阿銘就介紹一些幫我們分析系統狀態的工具。
14.1.1 使用w命令查看當前系統的負載
具體用法如下:??
# w 22:07:15 up 74 days, 7:52, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.18.1 22:07 1.00s 0.07s 0.01s w? 相信所有Linux管理員最常用的命令就是這個w了,該命令顯示的信息很豐富。第1行從左至右顯示的信息依次為:時間、系統運行時間、登錄用戶數、平均負載。從第2行開始的所有行則是告訴我們:當前登錄的用戶名及其登錄地址等。其實在這些信息中,阿銘認為最應該關注第1行中的 load average:后面的3個數值。 第1個數值表示1分鐘內系統的平均負載值,第2個數值表示5分鐘內系統的平均負載值,第3個數值表示15分鐘內系統的平均負載值。我們著重看第1個值,它表示單位時間段內使用CPU的活動進程數(在這里其實就是1分鐘內),值越大就說明服務器壓力越大。一般情況下,這個值只要不超過服務器的CPU數量就沒有關系。如果服務器的CPU數量為8,那么值小于8就說明當前服務器沒有壓力;否則就要關注一下了。查看服務器有幾個CPU的方法如下所示: ?
# cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 62 model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz stepping : 4 microcode : 0x427 cpu MHz : 2600.039 cache size : 20480 KB physical id : 0 siblings : 1 core id : 0 cpu cores : 1 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf bogomips : 5200.07 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management: processor : 1 vendor_id : GenuineIntel cpu family : 6 model : 62 model name : Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz stepping : 4 microcode : 0x427 cpu MHz : 2600.039 cache size : 20480 KB physical id : 2 siblings : 1 core id : 0 cpu cores : 1 apicid : 2 initial apicid : 2 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts bugs : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf bogomips : 5200.07 clflush size : 64 cache_alignment : 64 address sizes : 40 bits physical, 48 bits virtual power management:? 上例中,/proc/cpuinfo這個文件記錄了CPU的詳細信息。目前市面上的服務器有很多是2顆多核CPU,在Linux看來,它就是2*n個CPU(這里的n為單顆物理CPU上有幾核)。假如n是4,則查看這個文件時會顯示8段類似的信息,而最后一段信息的processor :?后面會顯示7。所以查看當前系統有幾個CPU,我們可以使用命令grep -c 'processor' /proc/cpuinfo。然而查看有幾顆物理CPU時,則需要查看關鍵字physical id。 另外一個查看CPU信息的命令為lscpu,如下所示: ?
# lscpu Architecture: x86_64 CPU op-mode(s): 32-bit, 64-bit Byte Order: Little Endian CPU(s): 2 On-line CPU(s) list: 0,1 Thread(s) per core: 1 Core(s) per socket: 1 Socket(s): 2 NUMA node(s): 1 Vendor ID: GenuineIntel CPU family: 6 Model: 62 Model name: Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz Stepping: 4 CPU MHz: 2600.039 BogoMIPS: 5200.07 Hypervisor vendor: VMware Virtualization type: full L1d cache: 32K L1i cache: 32K L2 cache: 256K L3 cache: 20480K NUMA node0 CPU(s): 0,1 Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc cpuid aperfmperf pni pclmulqdq ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cpuid_fault pti fsgsbase smep xsaveopt dtherm ida arat pln pts? 14.1.2 用vmstat命令監控系統的狀態 具體用法如下: ?
# 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 938948 4184 645672 0 0 61 128 90 182 1 1 98 0 0? 命令w查看的是系統整體上的負載,通過看那個數值可以知道當前系統有沒有壓力。但它無法判斷具體是哪里(CPU、內存、磁盤等)有壓力,所以這就用到了vmstat。vmstat命令打印的結果共分為6部分:procs、memory、swap、io、system和cpu。請重點關注一下r、b、si、so、bi、bo這幾列信息。
?
procs顯示進程的相關信息。
r(run):表示運行或等待CPU時間片的進程數。大家不要誤認為等待CPU時間片意味著這個進程沒有運行,實際上某一時刻1個CPU只能有一個進程占用,其他進程只能排著隊等著,此時這些排隊等待CPU資源的進程依然是運行狀態。該數值如果長期大于服務器CPU的個數,則說明CPU資源不夠用了。 b(block):表示等待資源的進程數,這個資源指的是I/O、內存等。舉個例子,當磁盤讀寫非常頻繁時,寫數據就會非常慢,此時CPU運算很快就結束了,但進程需要把計算的結果寫入磁盤,這樣進程的任務才算完成,那此時這個進程只能慢慢地等待磁盤了,這樣這個進程就是這個b狀態。該數值如果長時間大于1,則需要關注一下了。
memory顯示內存的相關信息。
swpd:表示切換到交換分區中的內存數量,單位為KB。
free:表示當前空閑的內存數量,單位為KB。
buff:表示(即將寫入磁盤的)緩沖大小,單位為KB。
cache:表示(從磁盤中讀取的)緩存大小,單位為KB。
swap顯示內存的交換情況。
si:表示由交換區寫入內存的數據量,單位為KB。 so:表示由內存寫入交換區的數據量,單位為KB。
io顯示磁盤的使用情況。
bi:表示從塊設備讀取數據的量(讀磁盤),單位為KB。 bo:表示從塊設備寫入數據的量(寫磁盤),單位為KB。
system顯示采集間隔內發生的中斷次數。
in:表示在某一時間間隔內觀測到的每秒設備的中斷次數。 cs:表示每秒產生的上下文切換次數。
cpu顯示CPU的使用狀態。
us:顯示用戶下所花費CPU的時間百分比。 sy:顯示系統花費CPU的時間百分比。 id:表示CPU處于空閑狀態的時間百分比。 wa:表示I/O等待所占用CPU的時間百分比。 st:表示被偷走的CPU所占百分比(一般都為0,不用關注)。 以上所介紹的各個參數中,阿銘經常會關注r、b和wa這3列。io部分的bi和bo也是要經常參考的對象,如果磁盤io壓力很大,這兩列的數值會比較高。另外,當si和so兩列的數值比較高并且不斷變化時,說明內存不夠了,內存中的數據頻繁交換到交換分區中,這往往對系統性能影響極大。 我們使用vmstat查看系統狀態時,通常都是使用如下形式:
?
# vmstat 1 5? 或者:
# vmstat 1? 前一條命令表示每隔1秒輸出一次狀態,共輸出5次;后一條命令表示每隔1秒輸出一次狀態且一直輸出,除非按Ctrl+C鍵結束。 14.1.3 用top命令顯示進程所占的系統資源 具體用法如下: ?
# top top - 2230 up 2 days, 8:14, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 154 total, 2 running, 152 sleeping, 0 stopped, 0 zombie %Cpu(s): 2.6 us, 7.7 sy, 0.0 ni, 87.2 id, 0.0 wa, 2.6 hi, 0.0 si, 0.0 st MiB Mem : 3770.4 total, 2086.4 free, 437.3 used, 1246.8 buff/cache MiB Swap: 4060.0 total, 4060.0 free, 0.0 used. 2893.2 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28123 root 20 0 60948 3948 3308 R 5.6 0.1 0:00.03 top 1 root 20 0 246944 14540 9144 S 0.0 0.4 3:42.49 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:04.89 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-kblockd 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 31:45.82 ksoftirqd/0 10 root 20 0 0 0 0 R 0.0 0.0 34:36.15 rcu_sched 11 root rt 0 0 0 0 S 0.0 0.0 16:37.79 migration/0 12 root rt 0 0 0 0 S 0.0 0.0 0:45.63 watchdog/0 13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/0 14 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cpuhp/1 15 root rt 0 0 0 0 S 0.0 0.0 0:46.99 watchdog/1 16 root rt 0 0 0 0 S 0.0 0.0 14:44.19 migration/1? top命令用于動態監控進程所占的系統資源,每隔3秒變一次。它的特點是把占用系統資源(CPU、內存、磁盤I/O等)最高的進程放到最前面。上例中,top命令打印出了很多信息,包括系統負載(load average)、進程數(Tasks)、CPU使用情況、內存使用情況以及交換分區使用情況。這些內容其實可以通過其他命令來查看,用top重點查看的還是下面的進程使用系統資源的詳細狀況,其中你需要關注%CPU、%MEM和COMMAND這幾項所代表的意義。RES這一項為進程所占的內存大小,而%MEM這一項為使用內存的百分比。在top狀態下,按Shift+m鍵可以按照內存使用大小排序。按數字1可以列出所有核CPU的使用狀態,按q鍵可以退出top。 另外,阿銘經常用到命令top -bn1,它表示非動態打印系統資源的使用情況,可以用在shell腳本中。示例如下: ?
# top -bn1 |head top - 2237 up 2 days, 8:15, 1 user, load average: 0.00, 0.00, 0.00 Tasks: 155 total, 1 running, 154 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 5.6 sy, 0.0 ni, 91.7 id, 0.0 wa, 2.8 hi, 0.0 si, 0.0 st MiB Mem : 3770.4 total, 2086.1 free, 437.6 used, 1246.8 buff/cache MiB Swap: 4060.0 total, 4060.0 free, 0.0 used. 2893.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 28137 root 20 0 60944 3944 3392 R 6.2 0.1 0:00.02 top 1 root 20 0 246944 14540 9144 S 0.0 0.4 3:42.49 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:04.89 kthreadd? 和top命令唯一的區別就是,它一次性輸出所有信息而非動態顯示。 14.1.4 用sar命令監控系統狀態 sar命令很強大,它可以監控系統幾乎所有資源的狀態,比如平均負載、網卡流量、磁盤狀態、內存使用等。與其他系統狀態監控工具不同,它可以打印歷史信息,可以顯示當天從零點開始到當前時刻的系統狀態信息。如果你的系統沒有安裝這個命令,請使用命令yum install -y sysstat安裝。初次使用sar命令會報錯,那是因為sar工具還沒有生成相應的數據庫文件(無需實時監控,因為不用去查詢那個庫文件)。它的數據庫文件在/var/log/sa/目錄下。因為這個命令太復雜,所以阿銘只介紹以下兩個方面。 1. 查看網卡流量?sar -n DEV 具體用法如下: ?
# sar -n DEV 1 5 Linux 4.18.0-80.el8.x86_64 (localhost.localdomain) 03/03/20 _x86_64_ (2 CPU) 22:31:30 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 22:31:31 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:31 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:31 ens33 1.00 1.00 0.06 0.18 0.00 0.00 0.00 0.00 22:31:31 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 22:31:32 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:32 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:32 ens33 12.00 23.00 0.70 2.69 0.00 0.00 0.00 0.00 22:31:32 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 22:31:33 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:33 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:33 ens33 1.00 2.00 0.06 0.71 0.00 0.00 0.00 0.00 22:31:33 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 22:31:34 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:34 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:34 ens33 1.00 2.00 0.06 0.71 0.00 0.00 0.00 0.00 22:31:34 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil 22:31:35 virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:35 lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 22:31:35 ens33 1.00 1.00 0.06 0.60 0.00 0.00 0.00 0.00 Average: IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcst/s %ifutil Average: virbr0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: lo 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 Average: ens33 3.20 5.80 0.19 0.98 0.00 0.00 0.00 0.00? 你的結果可能和阿銘的不一樣,這是因為網卡名字不一樣,總之這個命令會把網卡信息打印出來,這里的1 5和vmstat用法一樣,表示每隔1秒打印一次,共打印5次。IFACE這一列表示設備名稱,rxpck/s這一列表示每秒進入收取的包的數量,txpck/s這一列表示每秒發送出去的包的數量,rxkB/s這一列表示每秒收取的數據量(單位為KB),txkB/s這一列表示每秒發送的數據量(后面幾列不需要關注)。 如果有一天服務器丟包非常嚴重,那么你就應該查一下網卡流量是否異常了。如果rxpck/s那一列的數值大于4000,或者rxkB/s那一列的數值大于5000000,很有可能是被攻擊了。正常的服務器網卡流量不會這么高,除非是你自己在復制數據。 另外也可以使用-f選項查看某一天的網卡流量歷史,后面跟文件名。在Red Hat或者CentOS發行版中,sar的庫文件一定在/var/log/sa/目錄下,如果你剛安裝syssta包,該目錄下還未生成任何文件,其用法如下所示:
# sar -n DEV -f /var/log/sa/sa03? 2. 查看歷史負載?sar -q 具體用法如下: ?
# sar -q Cannot open /var/log/sa/sa03: No such file or directory? 如果報如上錯誤,可以重啟syssta服務,命令為systemctl restart sysstat。即使生成該文件,但依然還不能正常顯示結果,因為它需要每隔10分鐘才會記錄一次數據。這個命令有助于我們查看服務器在過去某個時間的負載狀況。其實阿銘介紹sar命令,只是為了讓你學會查看網卡流量(這是非常有用的)。如果你感興趣可以man一下,它的用法還有很多。 14.1.5 用nload命令查看網卡流量 sar雖然可以查看網卡流量,但是不夠直觀,還有一個更好用的工具,那就是nload。系統沒有默認安裝它,安裝方法如下: ?
# yum install –y epel-release; yum install –y nload? 安裝過程阿銘不再貼出來。關于上面的命令,也許你有疑問,為什么不直接寫兩個包呢?這是因為要想安裝nload,前提是先安裝epel-release包,nload包是在epel這個擴展源里面的。以后在工作中,你一定會經常使用epel擴展源安裝一些軟件包,非常方便。安裝完之后,直接運行nload命令,然后回車就會出現如下界面。是動態的哦,很直觀對不對?相信你會喜歡上這個工具。 ?
Device ens33 [192.168.72.128] (1/2): == Incoming: Curr: 944.00 Bit/s Avg: 1.20 kBit/s Min: 944.00 Bit/s Max: 1.84 kBit/s Ttl: 1.17 GByte Outgoing: Curr: 8.88 kBit/s Avg: 8.67 kBit/s Min: 5.35 kBit/s Max: 9.83 kBit/s Ttl: 58.45 MByt? 最上面一行為網卡名字以及IP地址,按向右箭頭可以查看其他網卡的網絡流量。輸出結果分為兩部分,Incoming為進入網卡的流量,Outgoing為網卡出去的流量,我們關注的當然是Curr那行的數據,其單位也可以動態自動調整,非常人性化。按q退出該界面。 14.1.6 用free命令查看內存使用狀況 具體用法如下: ?
total used free shared buff/cache available Mem: 1849532 230972 1346700 8852 271860 1460708 Swap: 2097148 0 2097148? free命令可以查看當前系統的總內存大小以及使用內存的情況。
total:內存總大小。
used:真正使用的實際內存大小。
free:剩余物理內存大小(沒有被分配,純剩余)。
shared:共享內存大小,不用關注它。
buff/cache:分配給buffer和cache的內存總共有多大。關于buffer和cache大家也許有一些疑惑,因為字面意思上兩者很相近。阿銘教你一個很容易區分這兩者的方法,buffer和cache都是一部分內存,內存的作用就是緩解CPU和IO(如,磁盤)的速度差距的,你可以這樣理解:數據經過CPU計算,即將要寫入磁盤,這時用的內存為buffer;CPU要計算時,需要把數據從磁盤中讀出來,臨時先放到內存中,這部分內存就是cache。
available:系統可使用內存有多大,它包含了free。Linux系統為了讓應用跑得更快,會預先分配一部分內存(buffer/cache)給某些應用使用,雖然這部分內存并沒有真正使用,但也已經分配出去了。然而,當另外一個服務要使用更多內存時,是可以把這部分預先分配的內存拿來用的。所以還沒有被占用的這部分buffer和cache再加上free就是available。
這個free命令顯示的結果中,其實有一個隱藏的公式:total=used+free+buff/cache。另外,available是由free這部分內存和buff/cache還未被占用的那部分內存組成。used那部分內存和buff/cache被占用的內存是沒有關系的。 free命令還可以加-m和-g選項(分別以MB或GB為單位)打印內存的使用狀況,甚至也支持-h選項。示例命令如下:?
# free -m total used free shared buff/cache available Mem: 1806 225 1315 8 265 1426 Swap: 2047 0 2047 # free -g total used free shared buff/cache available Mem: 1 0 1 0 0 1 Swap: 1 0 1 # free -h total used free shared buff/cache available Mem: 1.8Gi 225Mi 1.3Gi 8.0Mi 265Mi 1.4Gi Swap: 2.0Gi 0B 2.0Gi? 14.1.7 用ps命令查看系統進程 系統管理員一定要知道你所管理的系統都有哪些進程在運行,在Windows下只要打開任務管理器即可查看。那么在Linux下如何查看呢?其實使用前面介紹的top命令就可以,但是查看起來沒有ps命令方便,它是專門顯示系統進程的命令,如下所示:
# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.1 0.7 178496 13248 ? Ss 20:32 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 17 root 2 0.0 0.0 0 0 ? S 20:32 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I< 20:32 0:00 [rcu_gp] root 4 0.0 0.0 0 0 ? I< 20:32 0:00 [rcu_par_gp] root 6 0.0 0.0 0 0 ? I< 20:32 0:00 [kworker/0:0H-kblockd] root 7 0.0 0.0 0 0 ? I 20:32 0:00 [kworker/u256:0-events_unbound] root 8 0.0 0.0 0 0 ? I< 20:32 0:00 [mm_percpu_wq] root 9 0.0 0.0 0 0 ? S 20:32 0:00 [ksoftirqd/0] root 10 0.0 0.0 0 0 ? R 20:32 0:00 [rcu_sched] root 11 0.0 0.0 0 0 ? S 20:32 0:00 [migration/0] root 12 0.0 0.0 0 0 ? S 20:32 0:00 [watchdog/0] root 13 0.0 0.0 0 0 ? S 20:32 0:00 [cpuhp/0] root 15 0.0 0.0 0 0 ? S 20:32 0:00 [kdevtmpfs] root 16 0.0 0.0 0 0 ? I< 20:32 0:00 [netns] root 17 0.0 0.0 0 0 ? S 20:32 0:00 [kauditd] root 18 0.0 0.0 0 0 ? S 20:32 0:00 [khungtaskd] root 19 0.0 0.0 0 0 ? S 20:32 0:00 [oom_reaper] root 20 0.0 0.0 0 0 ? I< 20:32 0:00 [writeback] root 21 0.0 0.0 0 0 ? S 20:32 0:00 [kcompactd0] root 22 0.0 0.0 0 0 ? SN 20:32 0:00 [ksmd] root 23 0.0 0.0 0 0 ? SN 20:32 0:00 [khugepaged] root 24 0.0 0.0 0 0 ? I< 20:32 0:00 [crypto] root 25 0.0 0.0 0 0 ? I< 20:32 0:00 [kintegrityd]? 阿銘也經常看到有人喜歡用命令ps -elf,但它們顯示的信息基本上是一樣的。ps命令還有更多的用法,你只要會用這個命令就足夠了。下面介紹幾個系統進程的參數。
PID:表示進程的ID,這個ID很有用。在Linux中,內核管理進程就得靠pid來識別和管理某一個進程。比如我想終止某一個進程,則用命令“kill 進程的pid”。有時這樣并不能終止進程,需要加-9選項,即“kill -9 進程的pid”,但這樣有點暴力,嚴重的時候會丟數據,所以盡量還是別用。
STAT:進程的狀態。進程狀態分為以下幾種(不要求記住,但要了解)。
D:不能中斷的進程(通常為IO)。
R(run):正在運行中的進程,其中包括了等待CPU時間片的進程。
S(sleep):已經中斷的進程。通常情況下,系統的大部分進程都是這個狀態。
T:已經停止或者暫停的進程。如果我們正在運行一個命令,比如說sleep 10,我們按一下Ctrl+Z暫停進程時,用ps命令查看就會顯示T這個狀態。
W:(內核2.6xx以后不可用),沒有足夠的內存頁分配。
X:已經死掉的進程(這個好像從來不會出現)。 Z:僵尸進程,即殺不掉、打不死的垃圾進程,占用系統一點資源,不過沒有關系。如果占用太多(一般不會出現),就需要重視了。 <:高優先級進程。 N:低優先級進程。 L:在內存中被鎖了內存分頁。 s:主進程,后面阿銘講到nginx或者php-fpm服務的時候,你就能更好地理解它了。 l:多線程進程。 +:在前臺運行的進程,比如在當前終端執行ps aux就是前臺進程。 ps命令是阿銘在工作中用得非常多的一個命令,所以請記住它。阿銘經常會將ps連同管道符一起使用,用來查看某個進程或者它的數量。示例命令如下:??
# ps aux |grep -c sshd 4 # ps aux |grep sshd root 814 0.0 0.3 92304 6648 ? Ss 20:33 0:00 /usr/sbin/sshd -D -oCiphers=aes256-gcm@openssh.com,chacha20-poly1305@openssh.com,aes256-ctr,aes256-cbc,aes128-gcm@openssh.com,aes128-ctr,aes128-cbc -oMACs=hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha2-256,hmac-sha1,umac-128@openssh.com,hmac-sha2-512 -oGSSAPIKexAlgorithms=gss-gex-sha1-,gss-group14-sha1- -oKexAlgorithms=curve25519-sha256,curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1 -oHostKeyAlgorithms=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oPubkeyAcceptedKeyTypes=rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,ssh-rsa,ssh-rsa-cert-v01@openssh.com -oCASignatureAlgorithms=rsa-sha2-256,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,rsa-sha2-512,ecdsa-sha2-nistp521,ssh-ed25519,ssh-rsa root 1709 0.0 0.5 151200 9368 ? Ss 20:54 0:00 sshd: root [priv] root 1713 0.0 0.2 151200 5300 ? S 20:54 0:00 sshd: root@pts/0 root 1745 0.0 0.0 12320 1080 pts/0 R+ 20:57 0:00 grep --color=auto sshd? 上例中的4不準確,需要減掉1。因為使用grep命令時,grep命令本身也算一個進程。 14.1.8 用netstat命令查看網絡狀況 具體用法如下: ?
# netstat -lnp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 814/sshd tcp6 0 0 :::22 :::* LISTEN 814/sshd udp 0 0 0.0.0.0:68 0.0.0.0:* 1648/dhclient udp 0 0 127.0.0.1:323 0.0.0.0:* 766/chronyd udp6 0 0 :323 :::* 766/chronyd raw6 0 0 :::58 :::* 7 796/NetworkManager Active UNIX domain sockets (only servers) Proto RefCnt Flags Type State I-Node PID/Program name Path unix 2 [ ACC ] SEQPACKET LISTENING 21770 1/systemd /run/systemd/coredump unix 2 [ ACC ] STREAM LISTENING 25846 783/sssd_nss /var/lib/sss/pipes/nss unix 2 [ ACC ] SEQPACKET LISTENING 21557 1/systemd /run/udev/control unix 2 [ ACC ] STREAM LISTENING 24964 1/systemd /var/run/.heim_org.h5l.kcm-socket unix 2 [ ACC ] STREAM LISTENING 24966 1/systemd /run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 12679 1/systemd /run/systemd/journal/stdout unix 2 [ ACC ] STREAM LISTENING 32410 1496/systemd /run/user/0/systemd/private unix 2 [ ACC ] STREAM LISTENING 32419 1496/systemd /run/user/0/bus unix 2 [ ACC ] STREAM LISTENING 25795 763/sssd /var/lib/sss/pipes/private/sbus-monitor unix 2 [ ACC ] STREAM LISTENING 25816 780/sssd_be /var/lib/sss/pipes/private/sbus-dp_implicit_files.780 unix 2 [ ACC ] STREAM LISTENING 25804 761/VGAuthService /var/run/vmware/guestServicePipe unix 2 [ ACC ] STREAM LISTENING 21476 1/systemd /run/systemd/private Active Bluetooth connections (only servers) Proto Destination Source State PSM DCID SCID IMTU OMTU Security Proto Destination Source State Channel? 若沒有此命令,請使用yum?install net-tools安裝。由于書本頁面有限,顯示的字符已經換行,看起來有點亂。顯示的結果中,上面那一部分是tcp/ip,下面一部分是監聽的socket(unix開頭的行)。netstat命令用來打印網絡連接狀況、系統所開放端口、路由表等信息。阿銘最常用的兩種用法是netstat -lnp(打印當前系統啟動哪些端口)和netstat -an(打印網絡連接狀況),它們非常有用,請一定要記住。示例如下: ?
# netstat -an |head -n 20 // 為了節省空間, 只顯示前20行 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 52 192.168.72.128:22 192.168.72.1:52219 ESTABLISHED tcp6 0 0 :::22 :::* LISTEN udp 0 0 0.0.0.0:68 0.0.0.0:* udp 0 0 127.0.0.1:323 0.0.0.0:* udp6 0 0 :323 :::* raw6 0 0 :::58 :::* 7 Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 2 [ ACC ] SEQPACKET LISTENING 21770 /run/systemd/coredump unix 2 [ ACC ] STREAM LISTENING 25846 /var/lib/sss/pipes/nss unix 2 [ ACC ] SEQPACKET LISTENING 21557 /run/udev/control unix 3 [ ] DGRAM 12656 /run/systemd/notify unix 2 [ ] DGRAM 12658 /run/systemd/cgroups-agent unix 12 [ ] DGRAM 12670 /run/systemd/journal/dev-log unix 2 [ ] DGRAM 25475 /var/run/chrony/chronyd.sock unix 2 [ ACC ] STREAM LISTENING 24964 /var/run/.heim_org.h5l.kcm-socket unix 2 [ ACC ] STREAM LISTENING 24966 /run/dbus/system_bus_socket? 最右側為網絡連接的狀態,如果你對TCP三次握手比較熟悉,那應該對最后這一列的字符串不陌生。如果你管理是一臺提供Web服務(80端口)的服務器,那么就可以使用命令netstat -an |grep 80來查看當前連接Web服務的有哪些IP了。
編輯:黃飛
?
評論
查看更多