2011-01-18 19 views
13

目前我遇到130688字節的硬限制。如果我嘗試在一條消息中發送更大的內容,則會出現ENOBUFS錯誤。可以在linux中發送的AF_UNIX數據報消息的最大大小是多少?

我檢查了net.core.rmem_default,net.core.wmem_default,net.core.rmem_max,net.core.wmem_max和net.unix.max_dgram_qlen sysctl選項並增加了它們,但它們沒有效果,因爲這些處理總緩衝區大小而不是消息大小。

我也設置了SO_SNDBUF和SO_RCVBUF套接字選項,但是這與上面的問題相同。無論如何,默認套接字緩衝區大小基於_default套接字選項設置。

我查看了ENOBUFS在套接字堆棧中返回的內核源碼,但是它並不清楚它來自哪裏。似乎返回這個錯誤的唯一地方與無法分配內存有關。

最大尺寸實際上是130688嗎?如果沒有,可以在不重新編譯內核的情況下進行更改?

謝謝!

+2

這是一個巨大的數據報。在我看來,當你有一個很大的數據報時,你也可以使用TCP。 – 2011-01-18 21:37:01

+1

是的,這並沒有幫助。正如我在帖子中所述,無論您使用的是wmem設置,它都不會讓您通過130688發送消息。我有他們超過32MB,並已嘗試下面的許多組合。 – Jaime 2011-01-18 22:04:47

回答

12

AF_UNIX SOCK_DATAGRAM/SOCK_SEQPACKET數據報需要連續的內存。連續的物理內存是很難找到的,分配失敗,對內核日誌中記錄類似於此:

udgc: page allocation failure. order:7, mode:0x44d0 
[...snip...] 
DMA: 185*4kB 69*8kB 34*16kB 27*32kB 11*64kB 1*128kB 1*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3788kB 
Normal: 13*4kB 6*8kB 100*16kB 62*32kB 24*64kB 10*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 0*4096kB = 7012kB 
[...snip...] 

unix_dgram_sendmsg()電話sock_alloc_send_skb()lxr1,要求sock_alloc_send_pskb()data_len = 0和header_len =尺寸數據報lxr2的。 sock_alloc_send_pskb()分配來自「普通」skbuff緩衝區空間的header_len,以及來自分散/收集頁面lxr3data_len。所以,看起來AF_UNIX套接字不支持在當前Linux上進行分散/聚集。

相關問題