Şu anda 130688 baytlık bir katı sınırı aşıyorum. Bir iletide daha büyük bir şey göndermeye çalışırsam, bir ENOBUFS hatası alıyorum.Linux'ta gönderilebilecek maksimum AF_UNIX datagram mesajı boyutu nedir?
Ben net.core.rmem_default, net.core.wmem_default, net.core.rmem_max, net.core.wmem_max ve net.unix.max_dgram_qlen sysctl seçenekleri kontrol ve hepsini artmış ancak hiçbir etkisi nedeniyle var olan bunlar, toplam arabellek boyutuyla değil, ileti boyutuyla ilgilidir.
Ayrıca, SO_SNDBUF ve SO_RCVBUF yuva seçeneklerini de ayarladım, ancak bu yukarıdakiyle aynı sorunu yaşıyor. Varsayılan soket arabellek boyutu, zaten _default soket seçeneklerine göre ayarlanır.
Soket yığında ENOBUFS'nin döndüğü çekirdek kaynağına baktım, ancak nereden geldiğini açık değildi. Bu hatayı geri döndürecek gibi görünen tek yer, belleği ayırmama ile ilgilidir.
Maksimum boyut aslında 130688 mi? Eğer değilse, bu çekirdeği yeniden derlemeden değiştirilebilir mi?
Teşekkürler! AF_UNIX SOCK_DATAGRAM/SOCK_SEQPACKET datagramları, bitişik belleğe gereksinim duyar.
Bu büyük bir datagramdır. Benim düşünceme göre, büyük bir datagramınız olduğu zaman, TCP'yi de kullanmış olabilirsiniz. –
Evet, bu yardımcı olmuyor. Gönderide belirttiğim gibi, 60688'in üzerinde şahane ayarlarınıza bakılmaksızın bir mesaj göndermenize izin vermez. Onları 32MB üzerinde var ve bunun altında birçok kombinasyonları denedim. – Jaime
Sadece buna eklemek için. Gönderme arabellekleri ve alma arabellekleri tek iletiler için olduğu yanılsaması. Tampon, tüm mesajlar için toplam çekirdek tamponu. Wmem ve qlen sysctl seçenekleri aslında blokları nasıl ve ne zaman göndereceğini etkiler. Gönderme arabelleği dolduğunda (kimsenin almadığı varsayılarak), arabelleğin toplam baytları arabellek boyutunun ötesine geçtiğinde veya toplam sayım qlen'in ötesine geçerse, gönderme engellenir. – Jaime