1. 程式人生 > >linux 管道溢位問題分析

linux 管道溢位問題分析

由於專案中的執行緒間通訊使用到libuv中的pipe,由於libuv的高效能非同步結構,資料傳輸速度很快。為了方便資料解析試用了結構體,比如:

typedef struct A{
  a[1024*10];
};

可以看到一個數據包有10kb,在系統中檢視系統管道大小:

    

pipe_buf 大小:512*8 = 4kb,那豈不是一個包就溢位了,然而還有一個pipe最大容量,man 7 pipe 檢視:


最大容量是 65536 bytes = 64kb

接下來,如果pipe write執行緒的寫的比較快,或者pipe read執行緒由於某個處理耗時長,導致管道里有6個數據包沒有取出,再往裡寫就會提示resource temporarilly unvailable,甚至出現段錯誤。

這個問題解決也容易,pipe wirte 速度 < pipe read速度即可,這樣就不會溢位了,pipe read 的優化也很重要。