c10m问题
解决思路
内核配置
1.修改文件描述符上限
sysctl 修改fs.file-max=12000500或者echo 20000500 > /proc/sys/fs/nr_open或者ulimit -n 20000000
2.sysctl 修改tcp缓冲区大小
net.ipv4.tcp_mem=10000000 10000000 10000000
net.ipv4.tcp_rmem=1024 4096 16384
net.ipv4.tcp_wmem=1024 4096 16384
net.core.rmem_max=16384
net.core.wmem_max=16384
3.修改匹配网络中断/proc/interrupts和cpu亲和性。(smp_affinity )(pthread_setaffinity_np(),/proc/irq/smp_affinity)
4.使用2mb大页,提高tlb命中。修改大页数量,vm.nr_hugepages=30720。
5.每个cpu一个线程
开源解决方案
PF_RING Netmap DPDK
用户态协议栈
需要注意的问题
1.数据结构要注意:如果放在指针里,容易造成频繁cache miss。
2.TCB和Socket和对应的应用程序内存尽量放在一起,并且挂在同一个cpu上。
3.压缩数据并尽量挑小的数据类型保存数据。
4.注意字节填充字节对齐,减少cache失效,假共享问题。
5.内存池的使用,可以为对象,socket,线程为单位分配。
6.包处理可以通过预取。
7.超线程的cpu,注意同一个node的cpu共享L1L2cache。
8.修改 net.core.somaxconn 以及 net.core.tcp_max_syn_backlog
9.开启 tcp_syncookie 可以防止 syn floor 攻击,同时在 syn_backlog 已满的情况下,不会抛弃 syn 包。
10.tcp_max_tw_buckets
修改系统中处于 timewait 状态的连接的数目
11. tcp_tw_recycle
用于快速回收处于 timewait 的连接。但是它和 timestamp 一起作用时可能会导致同一个 NAT 过来的连接失败。关闭
12.timestamps
为了避免它和 tcp_tw_recycle 一起导致问题。关闭
13.tcp_tw_reuse
允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,效果不是很好。建议开启。
14.tcp_fin_timeout
如果本方关闭连接,则它在 FIN_WAIT_2 状态的时间。建议改为 10。
15.tcp_synack_retries
对于远端的连接请求 SYN,服务器对应的 ack 响应的数目。建议值10。
16.tcp_keepalive_time tcp_keepalive_intvl tcp_keepalive_probes
主要是为了解决 TCP 的 CLOSE_WAIT 问题。
tcp_keepalive_time
防止空连接攻击,可以缩小该值, 建议改为 180
tcp_keepalive_intvl
当探测没有确认时,重新发送探测的频度。缺省是 75 秒。建议改为 30 秒
tcp_keepalive_probes
进行多少次探测,因为探测的间隔是按照指数级别增长,默认为 9 次。建议改为 5 次。
17.ip route 提高拥塞窗口cwnd或者直接改变拥塞算法改成bbr。
18.修改网卡设备的中断数和cpu数一致,并且开启rps负载均衡和使用napi轮询。