由于項目中的線程間通訊使用到libuv中的pipe,由于libuv的高性能異步結(jié)構(gòu),數(shù)據(jù)傳輸速度很快。為了方便數(shù)據(jù)解析試用了結(jié)構(gòu)體,比如:
typedef?struct?A{??
??a[1024*10];??
};??
可以看到一個數(shù)據(jù)包有10kb,在系統(tǒng)中查看系統(tǒng)管道大?。?/p>

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

最大容量是 65536 bytes = 64kb
接下來,如果pipe write線程的寫的比較快,或者pipe read線程由于某個處理耗時長,導(dǎo)致管道里有6個數(shù)據(jù)包沒有取出,再往里寫就會提示resource temporarilly unvailable,甚至出現(xiàn)段錯誤。
這個問題解決也容易,pipe wirte 速度 < pipe read速度即可,這樣就不會溢出了,pipe read 的優(yōu)化也很重要。