linux – 通过域套接字传输的单个数据包的大小的实际限制是甚么
让我们假设有一个为典型的服务器 – 客户端程序创建的Unix域套接字.客户端通过套接字发送一个10GB缓冲区,同时由服务器消耗.
操作系统(Linux / BSD)将10GB缓冲区分成许多数据包并发送/使用它们,还是一次发送? 如果不可能一次发送10GB缓冲区的域套接字,那么单个数据包的实际大小限制是多少? 约束: >该程序将在Linux 2.6.32和FreeBSD 9上运行 解决方法
有许多因素将决定可以在Unix套接字上发送的数据包的最大大小:
> wmem_max套接字发送缓冲区最大大小的内核设置,它确定可以使用setsockopt(SO_SNDBUF)设置的发送缓冲区的最大大小.当前设置可以从/ proc / sys / net / core / wmem_max中读取,并且可以使用sysctl net.core.wmem_max = VALUE设置(将设置添加到/etc/sysctl.conf,以使更改在重新启动之间持续).请注意,此设置适用于所有套接字和套接字协议,而不仅仅适用于Unix套接字. 因此,为了最大程度地提高应用程序的性能,您需要一个大的套接字缓冲区大小(以最小化由于套接字写入系统调用的用户/内核空间上下文切换)和一个大型的Unix套接字队列(尽可能多地解耦生产者和消费者).但是,套接字发送缓冲区大小和队列长度的乘积不能太大,导致内核用完连续的内存区域(导致写入失败). 实际数字将取决于您的系统配置和使用情况.您将需要通过测试确定限制…开始说,在256Kb的wmem_max和max_dgram_qlen在32,并保持加倍wmem_max直到你注意到事情开始中断.您将需要调整max_dgram_qlen以在一定程度上平衡生产者和消费者的活动(尽管生产者比消费者快得多或慢得多),队列大小不会有太大的影响). 请注意,您的制作人必须通过调用setsockopt(SO_SNDBUF)将套接字发送缓冲区大小专门设置为wmem_max字节,并且必须将数据分割为wmem_max字节块(消费者将不得不重新组合它们). 最好的猜测:实际的限制是围绕wmem_max?8Mb和unix_dgram_qlen?32. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 华为7.0系统最简单激活xposed框架的流程
- linux – 如何在make目标之间传递ENV变量
- linux – Inode表随着时间的推移急剧缩小,导致rsync / inod
- 解决 ERROR: JDWP Transport dt_socket failed to initiali
- 尝试在linux上运行shell脚本时“无法执行二进制文件”
- Liunx基础命令——目录与文件管理方面(下篇,建议事先阅读
- 如何在Linux中使用`find`命令删除非空目录?
- linux – 即使在退出命令后,Shell脚本仍继续运行
- linux – 有什么方法可以防止用户cron作业破坏服务器?
- linux – 如何删除bash脚本的某个符号