私はさまざまなAPIをクエリし、それを使用する他のアプリケーションで使用するAPIを提供するRPi(Raspbian)3.12.35+ #730 PREEMPT Fri Dec 19 18:31:24 GMT 2014 armv6l GNU/Linux
でPython 2.7.8のデーモンを実行していますrequests
(両方とも同じコンピュータで実行されています)。私は最近、ログで(デーモンがしばらく実行された後)、例外によって開かれたファイルハンドラが不足していることを発見しましたrequests
。
('Connection aborted.', error(23, 'Too many open files in system'))
明示的にファイルを開いていないため、私のhttp
通話が開いていると思われます。
私は約10秒ごとに(主にlocalhostとして)呼び出し、1〜2時間デーモンを実行した後、lsof
32,000を超えるオープン接続を報告しますsock
。
python2 804 pi 982u unix 0xce3565a0 0t0 116809 socket
python2 804 pi 983u unix 0xcb5553c0 0t0 116875 socket
python2 804 pi 984u unix 0xcb555780 0t0 116899 socket
python2 804 pi 985u unix 0xd74dd1e0 0t0 117010 socket
python2 804 pi 986u unix 0xcb555d20 0t0 116918 socket
この数は、すべてのアプリケーションの呼び出し速度に応じて多少増加します。
'Connection': 'close'
コードで明示的に設定してこれらの接続を強制的に閉じたかったのですが、残念ながらこれは役に立ちませんでした。lsof
数え切れないほどのオープンsock
ハンドラがまだ表示されています。
netstat
多数DGRAM
の接続マーク(約12,000以上):
(...)
unix 2 [ ] DGRAM 74315
unix 2 [ ] DGRAM 68340
unix 2 [ ] DGRAM 67749
unix 2 [ ] DGRAM 58836
unix 2 [ ] DGRAM 58087
(...)
さらに心配なのは、tcpシーケンスがネットワークレベルで正しく閉じているようです。
だから私はここで迷子になりました。オープンディスクリプタの数の増加はhttp呼び出しによるものかもしれませんが、なぜ彼らがオープンハンドラを残すのかを理解するのは難しいですか?
注:もともとこの質問はSO(私のコードを指している)について質問しましたが、システム指向であると思います。