現(xiàn)象
- 直接使用foobar用戶SSH登錄正常
- 在root用戶下踢俄,執(zhí)行
su - foobar
但金,報(bào)錯(cuò):
su: cannot set user id: Resource temporarily unavailable
只有su的時(shí)候報(bào)錯(cuò)褂微,雖然不影響foobar用戶正常的SSH遠(yuǎn)程登錄友题,但這種資源受限的錯(cuò)誤嗤堰,一般都是系統(tǒng)崩潰的前兆,必須要較點(diǎn)真咆爽。
系統(tǒng):RHEL 6.5
排查過程
先按套路出牌
首先直接一通free -m
梁棠、 top
置森、 vmstat
等等,試試運(yùn)氣
不過也不出所料符糊,并沒有什么收獲凫海。但這也算是個(gè)好消息,至少說明不像是系統(tǒng)級(jí)別的資源問題了男娄。
感覺八成是線程數(shù)或者文件打開數(shù)搞的鬼了行贪,懶得監(jiān)控日志,接著排查模闲。
查看線程數(shù)
cat /proc/sys/kernel/threads-max
254529
最大線程數(shù)254529建瘫,沒有問題
ps -u foobar -L | wc -l
1045
用戶當(dāng)前線程數(shù)1045,雖然挺高了尸折,但這個(gè)用戶下部署的應(yīng)用也非常多啰脚,算是正常吧。
檢查ulimit
- 先用ulimit看一下設(shè)置的最大文件打開數(shù)
用foobar直接登錄实夹,然后執(zhí)行:
ulimit -n
655360
顯示655360橄浓,沒有問題
- 然后用
lsof
統(tǒng)計(jì)一下當(dāng)前的文件打開數(shù)
lsof | grep foobar | wc -l
1690
1690,大于1024有點(diǎn)多了亮航,接下來仔細(xì)看一下荸实。
-
lsof
大概的逐條分析一下
lsof | grep foobar
blablabla...
blablabla...
blablabla...
既有文件,也有網(wǎng)絡(luò)連接缴淋。不像是那種同時(shí)發(fā)起了大量網(wǎng)絡(luò)連接造成的故障准给。這里算是PASS了。
檢查limits.conf配置
走到這里重抖,還沒查出問題露氮,就有點(diǎn)意外了,索性再檢查一下limits.conf
吧
cat /etc/security/limits.conf
* soft nofile 655360
* hard nofile 655360
* soft noproc 655360
* hard noproc 655360
* soft core 0
* hard core 0
都是655360钟沛,一眼看上去沒有問題(但這里有個(gè)坑沦辙,稍后會(huì)提到)
檢查各個(gè)profile配置
再檢查各個(gè)profile的配置,例如.bash_profile里是不是手工設(shè)置了過小的ulimit讹剔,導(dǎo)致登錄失敗。
cat /etc/profile
cat /foobar/.bash_profile
都很正常详民,并沒有添加多余的東西進(jìn)去
監(jiān)控系統(tǒng)secure日志
到這時(shí)都沒發(fā)現(xiàn)出問題延欠,只能監(jiān)控系統(tǒng)日志/var/log/secure
了。
一邊監(jiān)控沈跨,一邊執(zhí)行su - foobar
:
tail -f /var/log/secure
blablabla...
Mar 30 12:08:02 localhost crond[29226]: pam_limits(crond:session): unknown limit item 'noproc'
blablabla...
終于抓到一個(gè)問題:noproc
參數(shù)是個(gè)什么鬼由捎,應(yīng)該是nproc
才對(duì)吧,估計(jì)管理員當(dāng)時(shí)是直接手?jǐn)]的饿凛,沒有復(fù)制粘帖狞玛。
于是趕緊修改limits.conf
vi /etc/security/limits.conf
將
* soft noproc 655360
* hard noproc 655360
改為
* soft nproc 655360
* hard nproc 655360
山窮水盡
解決完上面那個(gè)問題软驰,以為這下可以su成功了吧,然而并沒有心肪,報(bào)錯(cuò)依舊锭亏。
于是繼續(xù)監(jiān)控/var/log/secure
日志。現(xiàn)在報(bào)錯(cuò)變成了:
Mar 30 12:10:25 localhost su: pam_unix(su-l:session): session opened for user foobar by monitor(uid=0)
Mar 30 12:10:25 localhost su: pam_unix(su-l:session): session closed for user foobar
這種報(bào)錯(cuò)硬鞍,相當(dāng)于什么也沒說啊慧瘤。看來接下來固该,想要解決問題锅减,只能靠猜了。
一通google之后伐坏,找到了這么一句話:
In Red Hat Enterprise Linux 6, there's a default setting in /etc/security/limits.d/90-nproc.conf. Change the default limit for all users or add a new limit for the affected user.
這個(gè)limits.d/90-nproc.conf
之前從沒有注意過怔匣,難道它會(huì)覆蓋 limits.conf
嗎?
cat /etc/security/limits.d/90-nproc.conf
* soft nproc 1024
root soft nproc unlimited
這里的值是1024桦沉,嘗試改大一點(diǎn)每瞒,碰碰運(yùn)氣:
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 10240
root soft nproc unlimited
然后su - foobar
,竟然成功了永部。
經(jīng)驗(yàn)值+3
到此為止独泞,兩個(gè)坑都已經(jīng)被填上了。耗時(shí)15分鐘苔埋,經(jīng)驗(yàn)值+3:
- 遇到類似問題懦砂,直接監(jiān)控
/var/log/secure
,可以少走些彎路 - 注意
/etc/security/limits.conf
的參數(shù)拼寫 - 竟然還有
/etc/security/limits.d/90-nproc.conf
這么個(gè)東西组橄,且生效的時(shí)機(jī)詭異(只影響su荞膘,直接登錄不受影響)