CentOS系统参数优化
推荐书籍:《Linux性能优化大师》
内核相关参数( /etc/sysctl.conf
)
- 查看内核(
kernel
)参数配置
1 | sysctl -a |
网络性能参数
1 | net.core.somaxconn=65535 |
http 请求经过三次握手建立网络连接,处于监听状态的端口,都会有自己的监听队列,参数 net.core.somaxconn
就决定了监听队列大小的长度,负载很大的服务器,就需要把这个参数修改大一些。
net.core.netdev_max_backlog
在每个网络接口接收数据包的速率 比 内核处理数据包的速率快的时候,允许被发送到队列中的数据包的最大数量。
net.ipv4.tcp_max_syn_backlog
还未获得对方连接的请求,可以保存到队列中的最大数目,超过这个数据大小的连接可能就会被抛弃。
1 | #查看有多少个请求由监听变成了链接 |
1 | #列出所有的tcp协议的端口 |
net.ipv4.tcp_fin_timeout
用于处理 tcp 连接等待状态的时间
1 | #用于加快 tcp 连接的回收,tcp连接占满就会出现无法连接的状态 |
- tcp 连接接收和发送缓冲区大小的默认值和最大值(调整的大一些)
1 | net.core.wmem_default = 87380 |
- 减少失效连接所占用的 tcp 资源的数量,加快资源回收的效率(调整小一些)
1 | #tcp 发送 keepalive 的时间间隔,用户确认tcp连接是否有效,单位秒 |
内存性能参数
1 | kernel.shmmax = 4294967295 |
- 这个参数应该设置的足够大,以便能在一个共享内存段下容纳下整个的 Innodb 缓冲池的大小。(如果太低,就需要创建多个共享内存段,可能导致系统性能下降,原因是当实例启动的时候,多个共享内存段可能会导致当时系统性能轻微的性能下降,其他时候不会有影响)
- 这个值的大小对 64 位 linux 系统,可取的最大值为物理内存值-1byte,建议值为大于物理内存的一半,一般取值大于Innodb缓冲池的大小即可,可以取物理内存-1byte。
1 | vm.swappiness = 0 |
- 这个参数当内存不足时,会对性能产生比较明显的影响
Linux 系统内存交换区:
在Linux系统安装时,都会有一个特殊的磁盘分区,称之为系统交换分区。
使用 free -m
在系统中查看,可以看到类似下面的内容,其中 swap
就是交换分区。
1 | [root@VM_0_3_centos ~]# free -m |
当操作系统因为没有足够的内存时,就会将一些虚拟内存写到磁盘的交换区中,这样就会发生内存交换。
在MySQL 服务器上是或否要使用交换分区有一些争议:在MySQL服务所在的Linux系统上完全禁用交换分区。
带来的风险:降低操作系统的性能;容易造成内存溢出,崩溃,或都被操作系统kill掉。
在MySQL服务器上保留交换分区还是很有必要的,但是要控制何时使用交换分区。
1 | vm.swappiness = 0 |
- 参数告诉Linux内核除非虚拟内存完全满了,否则不要使用交换分区。
增加资源限制 /etc/security/limit.conf
这个文件实际上市 Linux PAM 也就是插入式认证模块的配置文件。
打开文件数的限制。
1 | * soft nofile 65535 |
- 用于控制打开文件的数量,加到 limit.conf 文件的末尾即可。 增加到 65535 以保证可以打开足够多的文件句柄。
- 表示对所有用户有效
- soft 指的是当前系统生效的设置
- hard 表明系统中所有设定的最大值
- nofile 表示所限制的资源是打开文件的最大数目
- 65536 就是限制的数量
- 这个文件修改需要重启系统才能生效。
磁盘调度策略
/sys/block/devname/queue/scheduler
1 | cat /sys/block/vda/queue/scheduler |
noop(电梯式调度策略) :NOOP 实现了一个 FIFO 队列,它像电梯的工作方法一样对 I/O 请求进行组织,当有一个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同一介质。 NOOP 倾向饿死读而立于写,因此 NOOP 对于闪存设备、RAM及嵌入式系统是最好的选择。
deadline(截止时间调度策略): deadline 确保了一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限。 这样就防止了写操作因为不能被读取而饿死的现象, deadline 对数据库类应用是最好的选择。
anticipatory (预料I/O调度策略): 本质上与deadline 一样,但在最后一次读操作后,要等待6ms,才能继续进行对其他I/O请求进行调度。 它会在每个6ms中插入新的I/O操作,而会将一些小写入流合并成一个大写入流,用写入延时换取最大的写入吞吐量。 AS适合于写入较多的环境,比如文件服务器,AS对数据库环境表现很差。