今天在處理 netlink 的時候,使用 Python 當作 user-space 承接來自 kernel-space 訊息的工具。我的情況是大約每 10ms 會由 kernel-space 發起一次 netlink multicast 到 user-space。當在運行 user-space script 的時候,過一陣子會出現這個錯誤:
1 2 3 4 |
Traceback (most recent call last): File “measure_netlink.py”, line 33, in <module> b = sock.recvfrom(NETLINK_BUF_LENGTH)[0] OSError: [Errno 105] No buffer space available |
一陣搜尋後, 其中一個方法是調整 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 後,解決問題。
Leave a Reply