Python socket OSError: [Errno 105] No buffer space available

今天在處理 netlink 的時候,使用 Python 當作 user-space 承接來自 kernel-space 訊息的工具。我的情況是大約每 10ms 會由 kernel-space 發起一次 netlink multicast 到 user-space。當在運行 user-space script 的時候,過一陣子會出現這個錯誤:

一陣搜尋後, 其中一個方法是調整 sysctl 的參數,沒用。

修改 net.ipv4.xfrm4_gc_thresh=999999,沒用。

來自 netfilter 的說明:

來自 netfilter 說明:這代表 kernel-side 的 netlink socker buffer 沒有空間了。因此 user-space 的程式沒有辦法處理來自 kernel 的資料。

有三種解法,1) 把 buffer size 透過 /proc/sys/net/core, sysctl 加大,或是使用 SO_RCVBUF file descriptor。2) 加快處理端的處理速度。3) 如果不需要太大的 buffer,嘗試把 buffer size 調低。

因為我的 user-space application 是使用 Python 運行,所以猜測改用 pypy 處理的話應該可以加速處理的速度,解決 No space available 的問題。

結局:

使用 pypy3 後,解決問題。




如果你覺得這篇文章不錯,歡迎打賞 IOTA:RFHEIVXVIZWJFXTZORZZRCMHZF9PSGFUFWAAKXTFNZE9JQUY9HFQREJYYSPSXDRLECKXCAQQDOMSMYJYDKPCKWXBKD

或是點選下方圖片贊助我一杯咖啡:

Leave a reply:

Your email address will not be published.

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料