1.python內存泄漏
今天在看服務器上的進程時,用top查的時候,發現一個一直跑的腳本程序內存竟然達到了1.6G,這個腳本我有印象,一開始僅占用20M左右,顯然是內存泄漏了。
用gc和objgraph,主要是objgraph,查看都是那些對象在增長,發現是dict/tuple這些內置類型的對象在增長,這個比較麻煩,因為可能程序里面用到這種類型的比較多,但我們的代碼簡單,所以一下在就知道問題在哪兒了,再次注釋以下。
2. python flask莫名core dump
日志中有如下日志:
error: cannot switch to a different thread
(libev) error creating signal/async pipe: Too many open files
發現當前文件打開限制比較低,修改為65535
發現沒用,猜想肯定還是會報錯,猜想是因為打開的文件描述符不斷增加導致的問題,所以用losf查看進程打開的文件,發現其中eventpoll這個文件描述符一直再增長,確定了這個原因導致的就要找到為什么了
深挖原因,發現如果沒有請求過去的話是不會增長描述符的,因此我需要確定在訪問的時候進程都做了啥(一開始沒有想到的,只是一直順着接口部分找原因,睡了一覺重新整理思路才開始找)。發現有問題的地方:
問題模塊訪問時多了倆個fcntl調用(用strace -p查看):
查看圈中的部分,發現不知為何將這個socket更改為了非阻塞的了,我想這才是導致這個問題的主要原因了。
繼續查是什么引起的:
由於在flask中使用了grequests庫,導致底層的socket行為變為非阻塞的了然后我在測試環境使用的是flask自帶的werkzeug server,里面的實現可能不完善,導致文件描述符泄漏。如果我使用uwsgi之類的server,不會出現泄漏。