【原創】python內存泄漏以及python flask框架莫名coredump

1.python內存泄漏python

今天在看服務器上的進程時,用top查的時候,發現一個一直跑的腳本程序內存居然達到了1.6G,這個腳本我有印象,一開始僅佔用20M左右,顯然是內存泄漏了。flask

用gc和objgraph,主要是objgraph,查看都是那些對象在增加,發現是dict/tuple這些內置類型的對象在增加,這個比較麻煩,由於可能程序裏面用到這種類型的比較多,但咱們的代碼簡單,因此一下在就知道問題在哪兒了,再次註釋如下。服務器

 

2. python flask莫名core dumpsocket

日誌中有以下日誌:async

error: cannot switch to a different thread
(libev) error creating signal/async pipe: Too many open files測試

發現當前文件打開限制比較低,修改成655353d

發現沒用,猜測確定仍是會報錯,猜測是由於打開的文件描述符不斷增長致使的問題,因此用losf查看進程打開的文件,發現其中eventpoll這個文件描述符一直再增加,肯定了這個緣由致使的就要找到爲何了日誌

深挖緣由,發現若是沒有請求過去的話是不會增加描述符的,所以我須要肯定在訪問的時候進程都作了啥(一開始沒有想到的,只是一直順着接口部分找緣由,睡了一覺從新整理思路纔開始找)。發現有問題的地方:server

問題模塊訪問時多了倆個fcntl調用(用strace -p查看):對象

 

查看圈中的部分,發現不知爲什麼將這個socket更改成了非阻塞的了,我想這纔是致使這個問題的主要緣由了。

繼續查是什麼引發的:

因爲在flask中使用了grequests庫,致使底層的socket行爲變爲非阻塞的了而後我在測試環境使用的是flask自帶的werkzeug server,裏面的實現可能不完善,致使文件描述符泄漏。若是我使用uwsgi之類的server,不會出現泄漏。

相關文章
相關標籤/搜索