代碼示例支持
平臺(tái): Centos 6.3
Python: 2.7.14
代碼示例: 菜單 - Python踩坑指南代碼示例
1.1 踩坑案例
長(zhǎng)期運(yùn)行的daemon進(jìn)程或者socket測(cè)試類進(jìn)程, 經(jīng)常遇到的坑是:
IOError: [Errno 24] Too many open files
即進(jìn)程遇到 IO 錯(cuò)誤, 無(wú)法打開更多的文件.
1.2 填坑和分析
一般從兩個(gè)方面入手:
1.2.1 從程序優(yōu)化入手
檢查文件打開是否遵循了"誰(shuí)打開誰(shuí)關(guān)閉"原則
文件是否存在關(guān)閉泄露
a. 誰(shuí)打開誰(shuí)關(guān)閉是個(gè)普適的原則:
只有邏輯設(shè)計(jì)者自己最熟悉
哪些文件 FD 需要一直維持打開狀態(tài)
哪些文件直到某個(gè)事件發(fā)生后關(guān)閉
短暫的文件讀寫打開推薦使用 pythonic 的 with statement
在此推薦小編創(chuàng)建的Python學(xué)習(xí)交流群:835017344,這里是python學(xué)習(xí)者聚集地,有大牛答疑,有資源共享!有想學(xué)習(xí)python編程的,或是轉(zhuǎn)行,或是大學(xué)生,還有工作中想提升自己能力的,正在學(xué)習(xí)的小伙伴歡迎加入學(xué)習(xí)。
with 語(yǔ)法會(huì)在生命周期后自動(dòng)關(guān)閉打開的文件 FD
with open('xxxx_path.file', 'w') as fhandle:
fhandle.dosth()
b. 檢查文件 FD 是否存在泄漏
系統(tǒng)設(shè)計(jì)階段一般會(huì)預(yù)估系統(tǒng)總體可打開的 FD 情況. 當(dāng)出現(xiàn)如下情況時(shí)可能出現(xiàn)了泄漏 BUG
外圍監(jiān)控系統(tǒng)發(fā)現(xiàn)該進(jìn)程 FD 大量突破了設(shè)計(jì)預(yù)估
打開 FD 增長(zhǎng)趨勢(shì)異常
一般隨著業(yè)務(wù)增加, FD 會(huì)線性增長(zhǎng), 但有限度和規(guī)律
如果增長(zhǎng)曲線不停的出現(xiàn)陡峭增長(zhǎng)且在業(yè)務(wù)低峰期也如此可能出現(xiàn)了泄露
Python 基礎(chǔ)庫(kù) CUP 提供對(duì)進(jìn)程打開 FD 的支持, 詳見示例代碼.
1.2.2 從資源軟硬限入手
了解系統(tǒng)的資源軟硬限制
檢查進(jìn)程可打開的FD是否突破了系統(tǒng)限制
長(zhǎng)期運(yùn)行的 daemon 進(jìn)程尤其注意
以 Centos 6.3 Linux系統(tǒng) 為例, 查看 /etc/security/limits.conf 獲得系統(tǒng)軟硬限資源
- soft nofile 10240
-
hard nofile 10240
其中, 用戶不能突破系統(tǒng)的硬線 hard nofile limit .
用戶也可以通過 shell 命令 ulimit -n 來(lái)限定該 shell 啟動(dòng)的所有進(jìn)程的 nofile
當(dāng)然非 root 用戶是不能突破系統(tǒng)硬線的
用戶為了進(jìn)程控制, 可以設(shè)定nofile更小
ulimit -a 可以查看當(dāng)前用戶被設(shè)定的限制, 示例:
[test@agent1 ~]$ ulimit -a
core file size (blocks, -c) 0
.......
open files (-n) 10240
.....
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
1.4.1 技術(shù)關(guān)鍵字
Open FD
資源 Soft limit / Hard limit
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
