準備環(huán)境
模擬nfs服務(wù)端問題導(dǎo)致nfs客戶端的進行hand死洒宝,具體表現(xiàn)為調(diào)用df
命令或者涉及訪問該目錄的命令時界面會hang住,如果大量后臺進行調(diào)用訪問該目錄會導(dǎo)致uptime
下的負載檢查腌逢,而實際所有的sar檢查都沒有發(fā)現(xiàn)任何性能問題。
為了重現(xiàn)環(huán)境,需要在準備一臺服務(wù)器(既做客戶端也做服務(wù)端)
安裝nfs rpm包并啟動服務(wù)
[root@vultr ~]# yum install nfs-utils -y
[root@vultr ~]# systemctl start nfs
[root@vultr ~]# systemctl start rpcbind
創(chuàng)建nfs服務(wù)端共享目錄
[root@vultr ~]# mkdir /var/nfs
[root@vultr ~]# chmod 755 /var/nfs/
[root@vultr ~]# chown nfsnobody:nfsnobody /var/nfs/
將目錄共享
修改/etc/exports配置文件吊奢,將新創(chuàng)建的共享目錄寫入文件茉继,并以讀寫模式進行共享咧叭。
[root@vultr nfs]# cat /etc/exports
/var/nfs *(rw,sync)
[root@vultr ~]# exportfs -a
確認共享情況并掛載
[root@vultr ~]# showmount -e 149.28.143.23
Export list for 149.28.143.23:
/var/nfs *
[root@vultr ~]# mount -t nfs 149.28.143.23:/var/nfs /mnt/nfs
[root@vultr ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 25778760 2714472 21737248 12% /
devtmpfs 496928 0 496928 0% /dev
149.28.143.23:/var/nfs 25778816 2714496 21737344 12% /mnt/nfs
所有環(huán)境都準完畢,目錄已經(jīng)掛載烁竭,下一步進行nfs服務(wù)端的停止操作
實驗
將nfs server進程停止菲茬,模擬NFS服務(wù)端故障導(dǎo)致客戶端掛起,此時df
命令無法正常運行派撕。
[root@vultr nfs]# systemctl stop nfs
[root@vultr nfs]# df
此處hang住
首先系統(tǒng)的表現(xiàn)為觀察uptime的負載非常高婉弹,單個CPU的服務(wù)器一分鐘負載去到17,表明多個進程在系統(tǒng)運行隊列中.
uptime
: System load averages is the average number of processes that are either in a runnable or uninterruptable state.
如下:
檢查sar情況可以證明大部分進程在等待運行:
-
sar -u 觀察CPU情況
cpu使用率非常低终吼,大部分為idle镀赌,說明沒有進程在等待cpu資源。
df_hand_sar_u.png
-
sar -d 觀察磁盤情況 磁盤dev253-0的tps幾乎為0际跪,說明沒有什么進程時等待磁盤商佛。
df_hand_sar_d.png -
sar -b 觀察IO情況 IO設(shè)備的讀寫tps都幾乎為0,瓶頸明顯不足IO設(shè)備
-
sar -W 觀察換頁情況 當時幾乎沒有進行換頁操作
df_hand_sar_W.png
-
sar -q 觀察隊列情況 隊列情況初步指出問題所在姆打,大量隊列堆積在任務(wù)列表中未執(zhí)行良姆,繼續(xù)考慮進程問題。
根據(jù)最明顯的問題根源“df
操作hang死”幔戏,通過strace
去分析df
命令的系統(tǒng)調(diào)用及信號情況玛追,可以明顯發(fā)現(xiàn)df
是在系統(tǒng)調(diào)用嘗試獲取目錄/var/nfs的stat信息時掛起,如下:
再觀察系統(tǒng)的mount
信息闲延,發(fā)現(xiàn)通過nfs掛載以下目錄/mnt/nfs
問題基本就在df
在訪問/mnt/nfs信息是hang住豹缀,通過ps aux
抓取系統(tǒng)運行的df
進程信息(大量df
,狀態(tài)為D+(無法中斷的休眠狀態(tài),后臺)),如下:
[root@vultr ~]# ps aux | grep df | wc -l
202
[root@vultr ~]# ps aux | grep -w df | head -5
root 2793 0.0 0.1 108020 760 pts/0 D+ 14:38 0:00 df
root 2794 0.0 0.1 108020 764 pts/0 D+ 14:38 0:00 df
root 2795 0.0 0.1 108020 760 pts/0 D+ 14:38 0:00 df
root 2796 0.0 0.1 108020 760 pts/0 D+ 14:38 0:00 df
root 2797 0.0 0.1 108020 764 pts/0 D+ 14:38 0:00 df
通過umount -lf
強制卸載文件系統(tǒng)慨代,df
恢復(fù)正常,通過killall df
將大量的殘余df進程中止后系統(tǒng)負載下降邢笙。
[root@vultr ~]# umount -lf /mnt/nfs
[root@vultr ~]# umount
Usage:
umount [-hV]
umount -a [options]
umount [options] <source> | <directory>
Options:
-a, --all unmount all filesystems
-f, --force force unmount (in case of an unreachable NFS system)
-l, --lazy detach the filesystem now, and cleanup all later
[root@vultr ~]#
[root@vultr ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 20616252 1595120 17956236 9% /
devtmpfs 238888 0 238888 0% /dev
tmpfs 249668 0 249668 0% /dev/shm
tmpfs 249668 8684 240984 4% /run
tmpfs 249668 0 249668 0% /sys/fs/cgroup
tmpfs 49936 0 49936 0% /run/user/0
[root@vultr ~]#
[root@vultr ~]# uptime
14:52:56 up 1:11, 2 users, load average: 5.68, 84.24, 79.26