如果你的TCP连接数量达到10万,并且内存消耗已经达到1G,以下是一些优化建议,可以帮助你减少内存使用:
1. 调整TCP缓冲区大小
如前所述,通过减小TCP的接收和发送缓冲区来降低内存占用。可以尝试更小的值,例如:
# 将接收和发送缓冲区减小到64K
sysctl -w net.core.rmem_default=65536
sysctl -w net.core.rmem_max=65536
sysctl -w net.core.wmem_default=65536
sysctl -w net.core.wmem_max=65536
2. 使用tcp_mem
参数
调整 tcp_mem
参数以控制TCP协议栈可使用的内存。
# 示例设置,根据实际需要进行调整:
sysctl -w net.ipv4.tcp_mem='9450000 10485760 20971520'
3. 调整socket选项
你还可以在程序中通过 setsockopt() 函数设置 TCP_NODELAY 和 SO_REUSEADDR 等选项,这些都能影响资源占用。
int opt = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&opt, sizeof(opt));
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&opt, sizeof(opt));
4. 设置较低的tcp_rmem
和 tcp_wmem
对于高并发场景,可以进一步减小每个socket允许的最大内存,例如将其限制在32K左右。
sysctl -w net.ipv4.tcp_rmem='4096 16384 32768'
sysctl -w net.ipv4.tcp_wmem='4096 16384 32768'
5. 减少TIME_WAIT状态持续时间
如之前提到,降低 tcp_fin_timeout
来加速释放连接:
sysctl -w net.ipv4.tcp_fin_timeout=15
同时,可以启用快速重用(如上文提到)以便在连接处于 TIME_WAIT 状态时能复用 socket。
持久化这些更改
与之前一样,将这些设置写入 /etc/sysctl.conf
文件中,以确保系统重启后仍然有效。
注意事项:
- 确保监测应用性能和稳定性,尤其是在高并发情况下。
- 在进行这些调整之前最好在测试环境中验证,确保不会对服务造成负面影响。
- 理解应用层面的需求,有时候某些参数可能会影响吞吐量或延迟,因此需要根据实际情况微调。
内容由零声教学AI助手提供,问题来源于学员提问