06月02, 2017

linux系统优化

调整 ulimit

在配置文件 /etc/security/limits.conf 中设置:

#<domain>      <type>    <item>        <value>
*              soft        core           0
*              soft        data           unlimited
*              soft       fsize           unlimited
*              soft         rss           unlimited
*              soft          as           unlimited
###########ES
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

参数说明: core:数据库出现故障时产生 core 文件用于故障诊断,生产 系统建议关闭; data:数据库进程所允许分配的数据内存大小; fsize:数据库进程所允许寻址的文件大小; rss:数据库进程所允许的最大 resident set 大小; as:数据库进程所允许最大虚拟内存寻址空间限制; 在配置文件 /etc/security/limits.d/90-nproc.conf 中设置:

#<domain>      <type>    <item>     <value>
*              soft       nproc      unlimited
##ES
* soft nproc 2048

参数说明: nproc:数据库所允许的最大线程数限制; Note:

  1. 每台作为数据库服务器的机器都需要配置;
  2. 更改配置后需重新登录使得配置生效。

调整内核参数

使用下列命令输出当前 vm 配置,并将其归档保存:

$ cat /proc/sys/vm/swappiness
$ cat /proc/sys/vm/dirty_ratio
$ cat /proc/sys/vm/dirty_background_ratio
$ cat /proc/sys/vm/dirty_expire_centisecs
$ cat /proc/sys/vm/vfs_cache_pressure
$ cat /proc/sys/vm/min_free_kbytes
$ cat /proc/sys/vm/overcommit_memory
$ cat /proc/sys/vm/overcommit_ratio

添加下列参数至 /etc/sysctl.conf 文件调整内核参数:

vm.swappiness = 0
vm.dirty_ratio = 100
vm.dirty_background_ratio = 40
vm.dirty_expire_centisecs = 3000
vm.vfs_cache_pressure = 200
vm.min_free_kbytes = <物理内存大小的8%,单位KB>
vm.overcommit_memory = 2
vm.overcommit_ratio = 85
##ES
vm.max_map_count=655360

Note: 当数据库可用物理内存不足 8GB 时不需使用 vm.swappiness = 0;上述 dirty 类参数只是建议值,具体系统设置时请按原则(控制系统的 flush 进程只采用脏页超时机制刷新脏页,而不采用脏页比例超支刷新脏页)进行设置。 执行如下命令,使配置生效:

sysctl -p

内核参数/etc/sysctl.conf

fs.file-max = 999999 
#表示单个进程最大可以打开的句柄数;

net.ipv4.tcp_tw_reuse = 1 
#参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在;

ner.ipv4.tcp_keepalive_time = 600 
#当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可以更快的清理无效链接。

net.ipv4.tcp_fin_timeout = 30 
#当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的最大时间

net.ipv4.tcp_max_tw_buckets = 5000 
#这个参数表示操作系统允许TIME_WAIT套接字数量的最大值,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。 
#该参数默认为180000,过多的TIME_WAIT套接字会使Web服务器变慢。

net.ipv4.ip_local_port_range = 1024 65000 
#定义UDP和TCP链接的本地端口的取值范围。

net.ipv4.tcp_rmem = 10240 87380 12582912 
#定义了TCP接受缓存的最小值、默认值、最大值。

net.ipv4.tcp_wmem = 10240 87380 12582912 
#定义TCP发送缓存的最小值、默认值、最大值。

net.core.netdev_max_backlog = 8096 
#当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的最大值。

net.core.rmem_default = 6291456 
#表示内核套接字接受缓存区默认大小。

net.core.wmem_default = 6291456 
#表示内核套接字发送缓存区默认大小。

net.core.rmem_max = 12582912 
#表示内核套接字接受缓存区最大大小。

net.core.wmem_max = 12582912 
#表示内核套接字发送缓存区最大大小。

注意:以上的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑;

net.ipv4.tcp_syncookies = 1 
#与性能无关。用于解决TCP的SYN攻击。

net.ipv4.tcp_max_syn_backlog = 8192 
#这个参数表示TCP三次握手建立阶段接受SYN请求列队的最大长度,默认1024,将其设置的大一些可以使出现Nginx繁忙来不及accept新连接的情况时,Linux不至于丢失客户端发起的链接请求。

net.ipv4.tcp_tw_recycle = 1 
#这个参数用于设置启用timewait快速回收。

net.core.somaxconn=262114 
# 选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。

net.ipv4.tcp_max_orphans=262114 
#选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值。

最终配置

fs.file-max = 999999 
net.ipv4.tcp_tw_reuse = 1 
ner.ipv4.tcp_keepalive_time = 600 
net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_max_tw_buckets = 5000 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.tcp_rmem = 10240 87380 12582912 
net.ipv4.tcp_wmem = 10240 87380 12582912 
net.core.netdev_max_backlog = 8096 
net.core.rmem_default = 6291456 
net.core.wmem_default = 6291456 
net.core.rmem_max = 12582912 
net.core.wmem_max = 12582912 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_max_syn_backlog = 8192 
net.ipv4.tcp_tw_recycle = 1 
net.core.somaxconn=262114 
net.ipv4.tcp_max_orphans=262114

修改好配置文件,执行 sysctl -p 命令,使配置立即生效

关闭transparent_hugepage

编辑/etc/rc.local,在第一行 “#!/bin/sh” 的下一行添加如下两行内容:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

执行如下命令,使配置生效:

$ source /etc/rc.local

检查是否成功关闭transparent_hugepage。分别执行如下两条命令,输出结果中都有 “[never]” 则表示成功关闭了transparent_hugepage,如果是 “never” 并且有 “[always]” 或者 “[madvise]” 则关闭失败:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
$ cat /sys/kernel/mm/transparent_hugepage/defrag

NUMA的影响

Linux系统默认开启NUMA,NUMA默认的内存分配策略是优先在进程所在CPU节点的本地内存中分配,会导致CPU节点之间内存分配不均衡,比如当某个CPU节点的内存不足时,会导致swap产生,而不是从远程节点分配内存,即使另一个CPU节点上有足够的物理内存。这种内存分配策略的初衷是好的,为了内存更接近需要它的进程,但不适合数据库这种大规模内存使用的应用场景,不利于充分利用系统的物理内存。我们建议用户在使用SequoiaDB时关闭NUMA。

关闭NUMA

关闭Linux系统的NUMA的方法主要有两种,一种是通过BIOS禁用NUMA;另一种是通过修改gurb的配置文件,CentOS、SUSE、Ubuntu的grub配置文件有差异,同一款Linux的不同版本配置也略有不同,此处会介绍CentOS6.4和Ubuntu12.04的配置方法以供参考,SUSE和CentOS修改方法类似。建议通过设置BIOS来禁用NUMA。下面提供两种关闭NUMA的方案,采用其中一种即可,设置好关闭NUMA后,请执行第2条,以检验是否成功关闭NUMA。

关闭NUMA的方案:

方案一:建议使用该方案,开机按快捷键进入BIOS设置界面,关闭NUMA,保存设置并重启,再执行第2条验证是否成功关闭NUMA。不同品牌的主板或服务器,具体操作略有差异,此处不作详细介绍。 方案二:修改grub的配置文件,关闭NUMA:

  1. CentOS6.4的grub配置文件修改,以root权限编辑 /etc/grub.conf ,找到kernel行,该行类似如下(不同的版本内容略有差异,但开头有“kernel /vmlinuz-”):
    kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_centos64001-lv_root rd_NO_LUKS rd_LVM_LV=vg_centos64001/lv_root rd_NO_MD rd_LVM_LV=vg_centos64001/lv_swap crashkernel=128M LANG=zh_CN.UTF-8  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
    
    在kernel行的末尾,空格再添加 “numa=off” ,如果有多个kernel行,则每个kernel行都要添加。
  2. Ubuntu12.04的grub文件修改,以root权限编辑 /boot/grub/grub.cfg ,找到Linux引导行,该行类似如下(不同版本内容略有差异,但开头有“linux /boot/vmlinuz-”):
    linux   /boot/vmlinuz-3.2.0-31-generic root=UUID=92191cd8-3690-4cd4-9f42-95d392c9d828 ro
    
    在Linux引导行的末尾,空格再添加 “numa=off” ,如果有多个Linux引导行,则每个Linux引导行都要添加。 修改后保存,再重启系统,再执行第2条验证是否成功关闭NUMA。 验证NUMA是否成功关闭,shell执行如下命令:
    $ numastat
    
    如果输出结果中只有 node0 ,则表示成功禁用了NUMA,如果有 node1 出现则失败。

网络优化

#vi /etc/sysctl.conf
#加入下面几行
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6= 1
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
vm.swappiness = 0
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
#执行命令生效:/sbin/sysctl -p

加大打开文件数的限制(open files)

此步骤需要重启机器生效,可以设置完后再重启

#vi /etc/security/limits.conf
#最后添加
* soft nofile 1024000
* hard nofile 1024000
hive   - nofile 1024000
hive   - nproc  1024000

用户进程限制

#vi /etc/security/limits.d/20-nproc.conf
#加大普通用户限制  也可以改为unlimited
*          soft    nproc     40960
root       soft    nproc     unlimited

本文链接:https://blog.jnliok.com/post/linux-optimizat.html

-- EOF --

Comments