眾所周知,生病了需要去醫(yī)院看病,大夫首先要詢問我們哪里不舒服,然后再通過觀察和自己的經(jīng)驗(yàn),大體上就能判定我們得的是什么病。然而Linux不會說話,它不會主動告訴我們哪里出現(xiàn)了問題,需要我們自己去觀察。那么如何評估系統(tǒng)運(yùn)行狀態(tài)是否良好呢?下面阿銘就介紹一些幫我們分析系統(tǒng)狀態(tài)的工具。
14.1.1 使用w命令查看當(dāng)前系統(tǒng)的負(fù)載
具體用法如下:??
# 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行從左至右顯示的信息依次為:時間、系統(tǒng)運(yùn)行時間、登錄用戶數(shù)、平均負(fù)載。從第2行開始的所有行則是告訴我們:當(dāng)前登錄的用戶名及其登錄地址等。其實(shí)在這些信息中,阿銘認(rèn)為最應(yīng)該關(guān)注第1行中的 load average:后面的3個數(shù)值。 第1個數(shù)值表示1分鐘內(nèi)系統(tǒng)的平均負(fù)載值,第2個數(shù)值表示5分鐘內(nèi)系統(tǒng)的平均負(fù)載值,第3個數(shù)值表示15分鐘內(nèi)系統(tǒng)的平均負(fù)載值。我們著重看第1個值,它表示單位時間段內(nèi)使用CPU的活動進(jìn)程數(shù)(在這里其實(shí)就是1分鐘內(nèi)),值越大就說明服務(wù)器壓力越大。一般情況下,這個值只要不超過服務(wù)器的CPU數(shù)量就沒有關(guān)系。如果服務(wù)器的CPU數(shù)量為8,那么值小于8就說明當(dāng)前服務(wù)器沒有壓力;否則就要關(guān)注一下了。查看服務(wù)器有幾個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的詳細(xì)信息。目前市面上的服務(wù)器有很多是2顆多核CPU,在Linux看來,它就是2*n個CPU(這里的n為單顆物理CPU上有幾核)。假如n是4,則查看這個文件時會顯示8段類似的信息,而最后一段信息的processor :?后面會顯示7。所以查看當(dāng)前系統(tǒng)有幾個CPU,我們可以使用命令grep -c 'processor' /proc/cpuinfo。然而查看有幾顆物理CPU時,則需要查看關(guān)鍵字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命令監(jiān)控系統(tǒng)的狀態(tài) 具體用法如下: ?
# 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查看的是系統(tǒng)整體上的負(fù)載,通過看那個數(shù)值可以知道當(dāng)前系統(tǒng)有沒有壓力。但它無法判斷具體是哪里(CPU、內(nèi)存、磁盤等)有壓力,所以這就用到了vmstat。vmstat命令打印的結(jié)果共分為6部分:procs、memory、swap、io、system和cpu。請重點(diǎn)關(guān)注一下r、b、si、so、bi、bo這幾列信息。
?
procs顯示進(jìn)程的相關(guān)信息。
r(run):表示運(yùn)行或等待CPU時間片的進(jìn)程數(shù)。大家不要誤認(rèn)為等待CPU時間片意味著這個進(jìn)程沒有運(yùn)行,實(shí)際上某一時刻1個CPU只能有一個進(jìn)程占用,其他進(jìn)程只能排著隊等著,此時這些排隊等待CPU資源的進(jìn)程依然是運(yùn)行狀態(tài)。該數(shù)值如果長期大于服務(wù)器CPU的個數(shù),則說明CPU資源不夠用了。 b(block):表示等待資源的進(jìn)程數(shù),這個資源指的是I/O、內(nèi)存等。舉個例子,當(dāng)磁盤讀寫非常頻繁時,寫數(shù)據(jù)就會非常慢,此時CPU運(yùn)算很快就結(jié)束了,但進(jìn)程需要把計算的結(jié)果寫入磁盤,這樣進(jìn)程的任務(wù)才算完成,那此時這個進(jìn)程只能慢慢地等待磁盤了,這樣這個進(jìn)程就是這個b狀態(tài)。該數(shù)值如果長時間大于1,則需要關(guān)注一下了。
memory顯示內(nèi)存的相關(guān)信息。
swpd:表示切換到交換分區(qū)中的內(nèi)存數(shù)量,單位為KB。
free:表示當(dāng)前空閑的內(nèi)存數(shù)量,單位為KB。
buff:表示(即將寫入磁盤的)緩沖大小,單位為KB。
cache:表示(從磁盤中讀取的)緩存大小,單位為KB。
swap顯示內(nèi)存的交換情況。
si:表示由交換區(qū)寫入內(nèi)存的數(shù)據(jù)量,單位為KB。 so:表示由內(nèi)存寫入交換區(qū)的數(shù)據(jù)量,單位為KB。
io顯示磁盤的使用情況。
bi:表示從塊設(shè)備讀取數(shù)據(jù)的量(讀磁盤),單位為KB。 bo:表示從塊設(shè)備寫入數(shù)據(jù)的量(寫磁盤),單位為KB。
system顯示采集間隔內(nèi)發(fā)生的中斷次數(shù)。
in:表示在某一時間間隔內(nèi)觀測到的每秒設(shè)備的中斷次數(shù)。 cs:表示每秒產(chǎn)生的上下文切換次數(shù)。
cpu顯示CPU的使用狀態(tài)。
us:顯示用戶下所花費(fèi)CPU的時間百分比。 sy:顯示系統(tǒng)花費(fèi)CPU的時間百分比。 id:表示CPU處于空閑狀態(tài)的時間百分比。 wa:表示I/O等待所占用CPU的時間百分比。 st:表示被偷走的CPU所占百分比(一般都為0,不用關(guān)注)。 以上所介紹的各個參數(shù)中,阿銘經(jīng)常會關(guān)注r、b和wa這3列。io部分的bi和bo也是要經(jīng)常參考的對象,如果磁盤io壓力很大,這兩列的數(shù)值會比較高。另外,當(dāng)si和so兩列的數(shù)值比較高并且不斷變化時,說明內(nèi)存不夠了,內(nèi)存中的數(shù)據(jù)頻繁交換到交換分區(qū)中,這往往對系統(tǒng)性能影響極大。 我們使用vmstat查看系統(tǒng)狀態(tài)時,通常都是使用如下形式:
?
# vmstat 1 5? 或者:
# vmstat 1? 前一條命令表示每隔1秒輸出一次狀態(tài),共輸出5次;后一條命令表示每隔1秒輸出一次狀態(tài)且一直輸出,除非按Ctrl+C鍵結(jié)束。 14.1.3 用top命令顯示進(jìn)程所占的系統(tǒng)資源 具體用法如下: ?
# 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命令用于動態(tài)監(jiān)控進(jìn)程所占的系統(tǒng)資源,每隔3秒變一次。它的特點(diǎn)是把占用系統(tǒng)資源(CPU、內(nèi)存、磁盤I/O等)最高的進(jìn)程放到最前面。上例中,top命令打印出了很多信息,包括系統(tǒng)負(fù)載(load average)、進(jìn)程數(shù)(Tasks)、CPU使用情況、內(nèi)存使用情況以及交換分區(qū)使用情況。這些內(nèi)容其實(shí)可以通過其他命令來查看,用top重點(diǎn)查看的還是下面的進(jìn)程使用系統(tǒng)資源的詳細(xì)狀況,其中你需要關(guān)注%CPU、%MEM和COMMAND這幾項(xiàng)所代表的意義。RES這一項(xiàng)為進(jìn)程所占的內(nèi)存大小,而%MEM這一項(xiàng)為使用內(nèi)存的百分比。在top狀態(tài)下,按Shift+m鍵可以按照內(nèi)存使用大小排序。按數(shù)字1可以列出所有核CPU的使用狀態(tài),按q鍵可以退出top。 另外,阿銘經(jīng)常用到命令top -bn1,它表示非動態(tài)打印系統(tǒng)資源的使用情況,可以用在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命令唯一的區(qū)別就是,它一次性輸出所有信息而非動態(tài)顯示。 14.1.4 用sar命令監(jiān)控系統(tǒng)狀態(tài) sar命令很強(qiáng)大,它可以監(jiān)控系統(tǒng)幾乎所有資源的狀態(tài),比如平均負(fù)載、網(wǎng)卡流量、磁盤狀態(tài)、內(nèi)存使用等。與其他系統(tǒng)狀態(tài)監(jiān)控工具不同,它可以打印歷史信息,可以顯示當(dāng)天從零點(diǎn)開始到當(dāng)前時刻的系統(tǒng)狀態(tài)信息。如果你的系統(tǒng)沒有安裝這個命令,請使用命令yum install -y sysstat安裝。初次使用sar命令會報錯,那是因?yàn)閟ar工具還沒有生成相應(yīng)的數(shù)據(jù)庫文件(無需實(shí)時監(jiān)控,因?yàn)椴挥萌ゲ樵兡莻€庫文件)。它的數(shù)據(jù)庫文件在/var/log/sa/目錄下。因?yàn)檫@個命令太復(fù)雜,所以阿銘只介紹以下兩個方面。 1. 查看網(wǎng)卡流量?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? 你的結(jié)果可能和阿銘的不一樣,這是因?yàn)榫W(wǎng)卡名字不一樣,總之這個命令會把網(wǎng)卡信息打印出來,這里的1 5和vmstat用法一樣,表示每隔1秒打印一次,共打印5次。IFACE這一列表示設(shè)備名稱,rxpck/s這一列表示每秒進(jìn)入收取的包的數(shù)量,txpck/s這一列表示每秒發(fā)送出去的包的數(shù)量,rxkB/s這一列表示每秒收取的數(shù)據(jù)量(單位為KB),txkB/s這一列表示每秒發(fā)送的數(shù)據(jù)量(后面幾列不需要關(guān)注)。 如果有一天服務(wù)器丟包非常嚴(yán)重,那么你就應(yīng)該查一下網(wǎng)卡流量是否異常了。如果rxpck/s那一列的數(shù)值大于4000,或者rxkB/s那一列的數(shù)值大于5000000,很有可能是被攻擊了。正常的服務(wù)器網(wǎng)卡流量不會這么高,除非是你自己在復(fù)制數(shù)據(jù)。 另外也可以使用-f選項(xiàng)查看某一天的網(wǎng)卡流量歷史,后面跟文件名。在Red Hat或者CentOS發(fā)行版中,sar的庫文件一定在/var/log/sa/目錄下,如果你剛安裝syssta包,該目錄下還未生成任何文件,其用法如下所示:
# sar -n DEV -f /var/log/sa/sa03? 2. 查看歷史負(fù)載?sar -q 具體用法如下: ?
# sar -q Cannot open /var/log/sa/sa03: No such file or directory? 如果報如上錯誤,可以重啟syssta服務(wù),命令為systemctl restart sysstat。即使生成該文件,但依然還不能正常顯示結(jié)果,因?yàn)樗枰扛?0分鐘才會記錄一次數(shù)據(jù)。這個命令有助于我們查看服務(wù)器在過去某個時間的負(fù)載狀況。其實(shí)阿銘介紹sar命令,只是為了讓你學(xué)會查看網(wǎng)卡流量(這是非常有用的)。如果你感興趣可以man一下,它的用法還有很多。 14.1.5 用nload命令查看網(wǎng)卡流量 sar雖然可以查看網(wǎng)卡流量,但是不夠直觀,還有一個更好用的工具,那就是nload。系統(tǒng)沒有默認(rèn)安裝它,安裝方法如下: ?
# yum install –y epel-release; yum install –y nload? 安裝過程阿銘不再貼出來。關(guān)于上面的命令,也許你有疑問,為什么不直接寫兩個包呢?這是因?yàn)橐氚惭bnload,前提是先安裝epel-release包,nload包是在epel這個擴(kuò)展源里面的。以后在工作中,你一定會經(jīng)常使用epel擴(kuò)展源安裝一些軟件包,非常方便。安裝完之后,直接運(yùn)行nload命令,然后回車就會出現(xiàn)如下界面。是動態(tài)的哦,很直觀對不對?相信你會喜歡上這個工具。 ?
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? 最上面一行為網(wǎng)卡名字以及IP地址,按向右箭頭可以查看其他網(wǎng)卡的網(wǎng)絡(luò)流量。輸出結(jié)果分為兩部分,Incoming為進(jìn)入網(wǎng)卡的流量,Outgoing為網(wǎng)卡出去的流量,我們關(guān)注的當(dāng)然是Curr那行的數(shù)據(jù),其單位也可以動態(tài)自動調(diào)整,非常人性化。按q退出該界面。 14.1.6 用free命令查看內(nèi)存使用狀況 具體用法如下: ?
total used free shared buff/cache available Mem: 1849532 230972 1346700 8852 271860 1460708 Swap: 2097148 0 2097148? free命令可以查看當(dāng)前系統(tǒng)的總內(nèi)存大小以及使用內(nèi)存的情況。
total:內(nèi)存總大小。
used:真正使用的實(shí)際內(nèi)存大小。
free:剩余物理內(nèi)存大小(沒有被分配,純剩余)。
shared:共享內(nèi)存大小,不用關(guān)注它。
buff/cache:分配給buffer和cache的內(nèi)存總共有多大。關(guān)于buffer和cache大家也許有一些疑惑,因?yàn)樽置嬉馑忌蟽烧吆芟嘟?。阿銘教你一個很容易區(qū)分這兩者的方法,buffer和cache都是一部分內(nèi)存,內(nèi)存的作用就是緩解CPU和IO(如,磁盤)的速度差距的,你可以這樣理解:數(shù)據(jù)經(jīng)過CPU計算,即將要寫入磁盤,這時用的內(nèi)存為buffer;CPU要計算時,需要把數(shù)據(jù)從磁盤中讀出來,臨時先放到內(nèi)存中,這部分內(nèi)存就是cache。
available:系統(tǒng)可使用內(nèi)存有多大,它包含了free。Linux系統(tǒng)為了讓應(yīng)用跑得更快,會預(yù)先分配一部分內(nèi)存(buffer/cache)給某些應(yīng)用使用,雖然這部分內(nèi)存并沒有真正使用,但也已經(jīng)分配出去了。然而,當(dāng)另外一個服務(wù)要使用更多內(nèi)存時,是可以把這部分預(yù)先分配的內(nèi)存拿來用的。所以還沒有被占用的這部分buffer和cache再加上free就是available。
這個free命令顯示的結(jié)果中,其實(shí)有一個隱藏的公式:total=used+free+buff/cache。另外,available是由free這部分內(nèi)存和buff/cache還未被占用的那部分內(nèi)存組成。used那部分內(nèi)存和buff/cache被占用的內(nèi)存是沒有關(guān)系的。 free命令還可以加-m和-g選項(xiàng)(分別以MB或GB為單位)打印內(nèi)存的使用狀況,甚至也支持-h選項(xiàng)。示例命令如下:?
# 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命令查看系統(tǒng)進(jìn)程 系統(tǒng)管理員一定要知道你所管理的系統(tǒng)都有哪些進(jìn)程在運(yùn)行,在Windows下只要打開任務(wù)管理器即可查看。那么在Linux下如何查看呢?其實(shí)使用前面介紹的top命令就可以,但是查看起來沒有ps命令方便,它是專門顯示系統(tǒng)進(jìn)程的命令,如下所示:
# 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]? 阿銘也經(jīng)??吹接腥讼矚g用命令ps -elf,但它們顯示的信息基本上是一樣的。ps命令還有更多的用法,你只要會用這個命令就足夠了。下面介紹幾個系統(tǒng)進(jìn)程的參數(shù)。
PID:表示進(jìn)程的ID,這個ID很有用。在Linux中,內(nèi)核管理進(jìn)程就得靠pid來識別和管理某一個進(jìn)程。比如我想終止某一個進(jìn)程,則用命令“kill 進(jìn)程的pid”。有時這樣并不能終止進(jìn)程,需要加-9選項(xiàng),即“kill -9 進(jìn)程的pid”,但這樣有點(diǎn)暴力,嚴(yán)重的時候會丟數(shù)據(jù),所以盡量還是別用。
STAT:進(jìn)程的狀態(tài)。進(jìn)程狀態(tài)分為以下幾種(不要求記住,但要了解)。
D:不能中斷的進(jìn)程(通常為IO)。
R(run):正在運(yùn)行中的進(jìn)程,其中包括了等待CPU時間片的進(jìn)程。
S(sleep):已經(jīng)中斷的進(jìn)程。通常情況下,系統(tǒng)的大部分進(jìn)程都是這個狀態(tài)。
T:已經(jīng)停止或者暫停的進(jìn)程。如果我們正在運(yùn)行一個命令,比如說sleep 10,我們按一下Ctrl+Z暫停進(jìn)程時,用ps命令查看就會顯示T這個狀態(tài)。
W:(內(nèi)核2.6xx以后不可用),沒有足夠的內(nèi)存頁分配。
X:已經(jīng)死掉的進(jìn)程(這個好像從來不會出現(xiàn))。 Z:僵尸進(jìn)程,即殺不掉、打不死的垃圾進(jìn)程,占用系統(tǒng)一點(diǎn)資源,不過沒有關(guān)系。如果占用太多(一般不會出現(xiàn)),就需要重視了。 <:高優(yōu)先級進(jìn)程。 N:低優(yōu)先級進(jìn)程。 L:在內(nèi)存中被鎖了內(nèi)存分頁。 s:主進(jìn)程,后面阿銘講到nginx或者php-fpm服務(wù)的時候,你就能更好地理解它了。 l:多線程進(jìn)程。 +:在前臺運(yùn)行的進(jìn)程,比如在當(dāng)前終端執(zhí)行ps aux就是前臺進(jìn)程。 ps命令是阿銘在工作中用得非常多的一個命令,所以請記住它。阿銘經(jīng)常會將ps連同管道符一起使用,用來查看某個進(jìn)程或者它的數(shù)量。示例命令如下:??
# 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不準(zhǔn)確,需要減掉1。因?yàn)槭褂胓rep命令時,grep命令本身也算一個進(jìn)程。 14.1.8 用netstat命令查看網(wǎng)絡(luò)狀況 具體用法如下: ?
# 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安裝。由于書本頁面有限,顯示的字符已經(jīng)換行,看起來有點(diǎn)亂。顯示的結(jié)果中,上面那一部分是tcp/ip,下面一部分是監(jiān)聽的socket(unix開頭的行)。netstat命令用來打印網(wǎng)絡(luò)連接狀況、系統(tǒng)所開放端口、路由表等信息。阿銘最常用的兩種用法是netstat -lnp(打印當(dāng)前系統(tǒng)啟動哪些端口)和netstat -an(打印網(wǎng)絡(luò)連接狀況),它們非常有用,請一定要記住。示例如下: ?
# netstat -an |head -n 20 // 為了節(jié)省空間, 只顯示前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? 最右側(cè)為網(wǎng)絡(luò)連接的狀態(tài),如果你對TCP三次握手比較熟悉,那應(yīng)該對最后這一列的字符串不陌生。如果你管理是一臺提供Web服務(wù)(80端口)的服務(wù)器,那么就可以使用命令netstat -an |grep 80來查看當(dāng)前連接Web服務(wù)的有哪些IP了。
編輯:黃飛
?
評論
查看更多