截止目前我们完整的阐述了秒杀系统的整个架构方案,当然编码这块大家只要能看到流程图,编码是完全没问题的。最后,程序肯定是放在服务器上解决的。所以我们从运维的角度还是要进行下服务器方面的优化,主要优化哪些呢?
1、增大服务器文件描述符
修改: echo "fs.file-max = 6553560" >> /etc/sysctl.conf sysctl -p 验证: sysctl -a | grep 'fs.file-max'
2、取消TCP重传机制
vim /etc/sysctl.conf 配置下面的值 net.ipv4.tcp_sack =1 重启生效 sysctl -p
3、关闭空闲连接和复用已分配的连接资源
vim /etc/sysctl.conf 配置下面的值 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_keepalive_time=1800 重启生效 sysctl -p
4、关闭粘包算法
vim /etc/sysctl.conf 配置下面的值 net.ipv4.tcp_syncookies=1 重启生效 sysctl -p
5、频繁收发大文件
net.core.rmem_default = 2097152 net.core.rmem_max = 5242880 net.core.wmem_default = 2097152 net.core.wmem_max = 5242880 net.ipv4.tcp_mem = 65536 393216 524288 net.ipv4.tcp_rmem = 1048576 2097152 5242880 net.ipv4.tcp_wmem = 1048576 2097152 5242880
备注:
这里,我们做个假设,假设系统最大可以给TCP分配 2GB 内存,最小值为 256MB,压力值为 1.5GB。按照一页为 4KB 来计算, tcp_mem 的最小值、压力值、最大值分别是 65536、393216、524288,单位是“页” 。 假如平均每个文件数据包为 512KB,每个套接字读写缓冲区最小可以各容纳 2 个数据包,默认可以各容纳 4 个数据包,最大可以各容纳 10 个数据包,那我们可以算出 tcp_rmem 和 tcp_wmem 的最小值、默认值、最大值分别是 1048576、2097152、5242880,单位是“字节”。而 rmem_default 和 wmem_default 是 2097152,rmem_max 和 wmem_max 是 5242880。 注:后面详细介绍这些数值是如何计算的~~ 这里,还需要注意的是:缓冲区超过了 65535,还需要将 net.ipv4.tcp_window_scaling 参数设置为 1。
上面主要是基于CentOS进行优化的。
还没有评论,来说两句吧...