关于高负载服务器Kernel的ipv4的TCP参数说明及优化
net.ipv4.tcp_mem
内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看:
#getconf PAGESIZE
4096
net.ipv4.tcp_mem = 196608 262144 393216
第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预
第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式
第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory
以上数值适用于4GB内存机器,对于8GB内存机器,建议用以下参数:
net.ipv4.tcp_mem = 524288 699050 1048576 (TCP连接最多约使用4GB内存)
net.ipv4.tcp_rmem 和 net.ipv4.tcp_wmem
为每个TCP连接分配的读、写缓冲区内存大小,单位是Byte
net.ipv4.tcp_rmem = 4096 8192 4194304
net.ipv4.tcp_wmem = 4096 8192 4194304
第一个数字表示,为TCP连接分配的最小内存
第二个数字表示,为TCP连接分配的缺省内存
第三个数字表示,为TCP连接分配的最大内存
一般按照缺省值分配,上面的例子就是读写均为8KB,共16KB
1.6GB TCP内存能容纳的连接数,约为 1600MB/16KB = 100K = 10万
4.0GB TCP内存能容纳的连接数,约为 4000MB/16KB = 250K = 25万
net.ipv4.tcp_max_orphans
最大孤儿套接字(orphan sockets)数,单位是个
net.ipv4.tcp_max_orphans = 65536
表示最多65536个
注意:当cat /proc/net/sockstat看到的orphans数量达到net.ipv4.tcp_max_orphans的约一半时,就会报:Out of socket memory
详见kernel源码:
include/net/tcp.h:
268 static inline bool tcp_too_many_orphans(struct sock *sk, int shift)
269 {
270 struct percpu_counter *ocp = sk->sk_prot->orphan_count;
271 int orphans = percpu_counter_read_positive(ocp);
272
273 if (orphans << shift > sysctl_tcp_max_orphans) {
274 orphans = percpu_counter_sum_positive(ocp);
275 if (orphans << shift > sysctl_tcp_max_orphans)
276 return true;
277 }
278
279 if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF &&
280 atomic_long_read(&tcp_memory_allocated) > sysctl_tcp_mem[2])
281 return true;
282 return false;
283 }
参考http://blog.tsunanet.net/2011/03/out-of-socket-memory.html
对于net.ipv4.tcp_max_orphans = 65536,当orphans达到32768个时,会报Out of socket memory,此时占用内存 32K*64KB=2048MB=2GB
(每个孤儿socket可占用多达64KB内存),实际可能小一些
net.ipv4.tcp_orphan_retries
孤儿socket废弃前重试的次数,重负载web服务器建议调小
net.ipv4.tcp_orphan_retries = 1
设置较小的数值,可以有效降低orphans的数量(net.ipv4.tcp_orphan_retries = 0并不是想像中的不重试)
net.ipv4.tcp_retries2
活动TCP连接重传次数,超过次数视为掉线,放弃连接。缺省值:15,建议设为 2或者3.
net.ipv4.tcp_synack_retries
TCP三次握手的syn/ack阶段,重试次数,缺省5,设为2-3
net.ipv4.tcp_fin_timeout = 30
FIN_WAIT状态的TCP连接的超时时间
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
TIME_WAIT状态的socket快速回收,循环使用
net.ipv4.tcp_max_syn_backlog = 4096
TCP连接SYN队列大小
net.core.netdev_max_backlog = 2048
网络设备的收发包的队列大小
net.ipv4.tcp_syncookies = 1
TCP SYN Cookies,防范DDOS攻击,防止SYN队列被占满
参考文献:
http://jaseywang.me/2012/05/09/%E5%85%B3%E4%BA%8E-out-of-socket-memory-%E7%9A%84%E8%A7%A3%E9%87%8A-2/
http://blog.tsunanet.net/2011/03/out-of-socket-memory.html
http://rdc.taobao.com/blog/cs/?p=1062
关于高负载服务器Kernel的ipv4的TCP参数说明及优化的更多相关文章
- 关于高负载服务器Kernel的TCP参数优化
net.ipv4.tcp_mem 内核分配给TCP连接的内存,单位是Page,1 Page = 4096 Bytes,可用命令查看: #getconf PAGESIZE 4096 net.ipv4.t ...
- keepalived+LVS 实现双机热备、负载均衡、失效转移 高性能 高可用 高伸缩性 服务器集群
本章笔者亲自动手,使用LVS技术实现实现一个可以支持庞大访问量.高可用性.高伸缩性的服务器集群 在读本章之前,可能有不少读者尚未使用该技术,或者部分读者使用Nginx实现应用层的负载均衡.这里大家都可 ...
- Cluster基础(三):配置HAProxy负载平衡集群、Keepalived高可用服务器、Keepalived+LVS服务器
一.配置HAProxy负载平衡集群 目标: 准备三台Linux服务器,两台做Web服务器,一台安装HAProxy,实现如下功能: 客户端访问HAProxy,HAProxy分发请求到后端Real Ser ...
- [效果不错] nginx 高并发参数配置及linux内核参数优化,完整的内核优化设置。PHP-FPM高负载解决办法。
背景:对vps小资源的实践中对,https://justwinit.cn/post/7536/ 的再优化,再实践,再优化,特别是Nginx,PHP,内核: 零)Nginx: error_log /da ...
- 烂泥:高负载均衡学习haproxy之关键词介绍
本文由ilanniweb提供友情赞助,首发于烂泥行天下 上一篇文章我们简单讲解了有关haproxy的安装与搭建,在这篇文章我们把haproxy配置文件中使用到的关键词一一介绍下. 关注我微信ilann ...
- PHP高并发高负载系统架构
PHP高并发高负载系统架构 1.为什么要进行高并发和高负载的研究 1.1.产品发展的需要 1.2.公司发展的需要 1.3.当前形式决定的 2.高并发和高负载的约束条件 2.1.硬件 2.2.部署 2. ...
- 烂泥:高负载均衡学习haproxy之安装与配置
本文由秀依林枫提供友情赞助,首发于烂泥行天下 有关高负载均衡的软件,目前使用比较多的是haproxy.nginx和lvs.下面我们就开始学习haprxoy这款软件. 一.haproxy介绍 以下开始介 ...
- Nginx+PHP-fpm高负载优化及压力测试方法
Nginx+PHP-fpm组合,以内存占用小,负载能力强壮的特点,成为小内存VPS建站的首选组合.我们一起来探讨一下nginx+php-fpm高负载的优化方法. 先来看看nginx配置参数的优化.ng ...
- Mysql 高负载排查思路
Mysql 高负载排查思路 发现问题 top命令 查看服务器负载,发现 mysql竟然百分之两百的cpu,引起Mysql 负载这么高的原因,估计是索引问题和某些变态SQL语句. 排查思路 1. 确定高 ...
随机推荐
- vue+element 通过ref修改一切硬核样式~
今天的需求是这样的,点击按钮,弹出一个Popover 弹出框 然后老大说,把弹出框往下移移,box-shadow值设的大一些... 然后就查看elenent的Popover文档,并没有方法,而且这个组 ...
- 【RAC】 RAC For W2K8R2 安装--结尾篇(十)
[RAC] RAC For W2K8R2 安装--结尾篇(十) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其 ...
- day 07 预科
目录 异常处理 字符串内置方法 1.索引取值 2.切片 3.成员运算 4.for循环 5.len() 6.strip(): 默认去掉两端空格 7.lsteip()/rstrip(): 去左端/右端 空 ...
- MySQL Charset--UTF8和UTF8MB4对比测试
UTF8和UTF8MB4 在早期MySQL版本中,使用只支持最长三字节的UTF8字符集便可以存放所有Unicode字符.随着Unicode的完善,Unicode字符集收录的字符数量越来越多,最新版本的 ...
- python开发总结
1.思维缜密的编程逻辑 2.满足明确的目的需求 3.运用现成的轮子加以改造 4.学会装饰自己的程序 5.化繁为简 6.多用配置文件作为入口 7.注意扩展兼容
- postgres —— 分组集与部分聚集
创建表 create table t_oil ( region text, country text, year text, production int, comsumption int ) 导入数 ...
- AspxGridView行为:分页、分组、排序、过滤、锁定列
HTML页面 <dx:ASPxGridView ID="grvList" Width="100%" runat="server" Au ...
- np.mean()函数
1. 数组的操作: import numpy as np a = np.array([[1, 2], [3, 4]]) print(a) print(type(a)) print(np.mean(a) ...
- iptables的使用
四表五链 四表(table):raw.mangle.nat.filter 五链(chain):PREROUTING.INPUT.FORWARD.OUTPUT.POSTROUTING 每个表存在几个或全 ...
- hdu3625
hdu3625 题意: 酒店发生一起谋杀案.作为镇上最好的侦探,您应该立即检查酒店的所有N个房间.但是,房间的所有门都是锁着的,钥匙刚锁在房间里,真是个陷阱!您知道每个房间里只有一把钥匙,并且所有可能 ...