开发者学堂课程【线上Linux服务器优化经验:系统资源调优与内核参数配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/382/detail/4801
系统资源调优与内核参数配置
内容简介
一.系统资源调优
1.关注ulimit命令
2.系统内核参数调优
ip_conntrack_max 参数
swappiness 参数
一.系统资源调优
1.关注 ulimit 命令 可以设置系统资源
ulimit-n (最大打开文件数)
我们输入 ulimit -a,
它会把系统里面所有的资源信息都给列出来,这里面有
Core file size (blocks,-c) 0
表示是否打开 Core 文件调试,这个主要针对我们程序 C 或者 C++,如果调试问题,我们可以通过这个打开,通过 Core 文件调试他们的异常。
另外是关于数字文件,数字样式的大小,默认情况下我们都不做设置,保持文件大小。其中我们重点关注。
open files (-n) 65535打开的最大文件数,通过这个命令我们也可以看到,打开最大文件数的方法就是 -n,它的配置就是系统中的配置打开最大文件数,这个文件不是严格意义上的文件,在 ulimit 里面它的专业名词叫做文件句柄。
其实也就是说,一个进程可能会加载很多文件句柄。因此我们在查文件数也就是在ulimit 里面查文件句柄的大小。
还有一个我们需要经常关注的就是最大用户数,这也是要重点关注的
max user processes (-u) 7811
其他的一般出现问题的几率很低。
那么与 ulimit-n 相关的一个问题
常见案例日志:
java.net.SocketException: Too many open files
这个报错是 java 用的一个报错,为什么在 java 应用里面会有这么多报错,就是因为 java 这个里面占用资源的方法和其他应用是不一样的。
一个 java 进程他其实是有多线程去运行的,那么每个线程会加载很多文件句柄,然后一个进程有很多个线程,一个线程又加载很多个文件,这样就会有很多很多文件句柄,因此 java 的应用我们会重点关注系统资源这个打开最大文件数文件数,这个问题是经常会发生的。出现这个问题是因为我们打开的系统文件数超出了限制。
那怎么样解决这个问题或者怎么样避免这个问题,其实也就是有几个配置文件需要修改。
相关配置文件:
/etc/security/limits.conf
主配置文件(
centos
5
.x
,
centos6.x
版本有)
/etc/security/limits.d/90-nproc.conf
(centos6.x版本后新增的文件)
*(用户名)
soft
(软限制)
nofile
65536
(打开最大文件数的大小)
*(用户名)
hard
(硬限制)
nofile
65536
u
limit
-
u(最大用户数)
和系统相关
*(用户名)
soft
nproc
65536
r
oot
soft
nproc
unlimited
如何修改打开的最大文件数?
通过
*
soft
nofile
65536
*
hard
nofile
65536
这两个参数加到/etc/security/limits.conf之后就可以了。
配置完成之后不会马上生效,一般是要退出去重新进来在生效
这是以生效的结果。
2.系统内核参数调优
内核参数调优要综合各方面的知识去权衡,然后再根据我们的业务特点或环境综合做调试,没有固定不变的一个参数。
常见案例日志:
kernel: ip_conntrack: table full, dropping packet
这个报错的原因就是由于系统参数有问题导致的。
那么具体和谁相关?
这个报错关注点就是 ip_conntrack_max 参数,这个参数其实是内核参数。
这个参数在 centos5.x,centos6.x,每个版本都是不一样的。
ip_conntrack_max 参数
/proc/sys/net/ipv4/netfilter/ip_conntrack_max
(路径)
或者
/proc/sys/net/ipv4/ip_conntrack_max(centos5.x)
/proc/sys/net/netfilter/nf_conntrack_max(centos6.x)
因为在 ip_conntrack 里面他其实是维护了一个访问,连接的一个链表,他一个链表他其实是有一个限制值的,比如一个进来是会有一个连接的链表,第二个进来的时候它会显示第二个,以此类推,他有很多个。
那么当这个连接的链表满了之后就会发生 table full 这个问题。知道了这个原理,解释这个问题就方便多了。
为了杜绝我们线上的服务器会发生类似问题,我们在服务器部署刚开始就把这个值调的大一点,是没有任何坏处的。
第一我们调大不会增加服务器的负载,所以我们把这个值调大就会避免很多问题。
它的参数值就是 net.ipv4.netfilter.ip_conntrack_max
调参数在 /etc/sysctl.conf 加入
net.ipv4.netfilter
.
ip_conntrack_max= 655360(centos5.x)
net.nf_conntrack_max=100000(centos6.x)
swappiness 参数
表示使用 swap 的概率,此值越大,表示使用 swap 的概率越大。
推荐配置如下:
查看目前配置:cat/proc/sys/vm/swappiness
添加如下内容到/etc/sysctl.conf
vm.swappiness=10
(这个值越小,使用率越低)
表示当内存使用率超过 (100-10)90% 时,才开始使用 swap。
我们线上 web 服务器配置参考(每天3亿的量)
如下配置:
net ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw recycle=1
net.ipv4.tcp_fin_timeout =10
net.ipv4.tcp_max_syn_backlog=20000
net.core.netdev_max_backlog= 32768
net.core.somaxconn=32768
net.core.wmem_default =8388608
net.core.rmem_default = 8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries =2
net ipv4.tcp_mem = 94500b00 915000000 927000000
net.ipv4.tcp_max_orphans=3276800
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_max_tw_buckets = 500000
net ipv4.tcp_keepalive_time=60
net.ipv4.tcp_keepalive_intvl= 15
net.ipv4.tcp_keepalive_probes = 5
net.nf_conntrack_max=2097152