性能优化

385 阅读6分钟

本文正在参与 “性能优化实战记录”话题征文活动

性能问题理论概述

系统的性能是指操作系统完成任务的有效性,稳定性和响应速度,例如在linux上面搭建一个web服务,可能会出现网页无法打开,打开速度慢等现象,遇到这些问题,有人说linux系统不好,但实际上并不是这样。操作系统完成一个任务,与系统自身的设置,网络拓扑结构,网络连接,接入策略等等多个环节有关,任何一个环节出现问题,都会影响整个系统的性能。当出现问题后,应从应用程序,操作系统,网络环境等方面综合排查,找出问题,然后解决。

在应用程序,操作系统,网络环境等方面,影响最大的是应用程序和操作系统两个方面,因为这两个方面出现问题不易察觉,隐蔽性很强。

系统硬件资源

cpu

cpu是操作系统运行的根本,cpu的速度与性能很大程度决定了系统的性能,因此cpu数量越多,主频越高,服务器性能就更好,但并非这样。

目前大部分cpu在大部分时间内只能运行一个线程,超线程处理器可以处理可以在同一时间可以执行多个线程,可以利用超线程处理特征提高性能。在linux系统下,只有运行SMP内核才能支持超线程,但是安装的cpu数量越多,超线程获得的性能的提高就越少。

可能出现cpu瓶颈的有db服务器,动态web服务器,对于这类应用,要把cpu的性能和配置放在主要位置

内存

内存的大小也是影响linux性能的一个重要因素,内存太小,系统进程会被阻塞,内存太大,资源浪费。

数据服务器,缓存服务器等,对于这类应用,要把内存大小放在首位。

磁盘I/O

磁盘I/O的性能直接影响应用程序的性能。如今通过磁盘RAID技术来提高I/O的性能。

内核参数的优化

centos7内核优化

在默认参数下。linux对高并发支持并不好,主要受制于单线程最大打开文件的限制,内核tcp参数方面和i/o事件分配机制等

iptables参数

如非必须,关闭或者卸载iptables防火墙,并阻止kernel加载iptables模块,这些模块影响高并发性能

单线程最大打开文件

一般的发行版最大打开文件的限制是1024,但是实际是不够的

# ulimit -n 65535
将root启动的单一进程的最大的打开文件数设置为65535,如果系统回显类似于"Operationnotpermitted"之类的话说明上述修改失败。实际上是因为在中指定的数值超过了linux系统对该用户打开文件的软限制或者硬限制,因此需要修改linux系统对于用户打开文件的软限制或者硬限制
  • 第一步,修改limits.conf文件,并添加
#vim /etc/security/limits.conf*softnofile 65535
*hard nofile65535

其中‘*’是表示修改所用用户的限制,soft 和hard指定要修改的事软限制和硬限制,65535表示想要修改的新的限制值,即最大打开文件限制数,(注意软限制要求小于或者等于硬限制)修改完后保存文件

  • 第二步,修改/etc/pam.d/login文件,在文件中添加如下行(如果没有这个文件直接ulimit -n查看,就可以看到修改的,不用执行这一步)
vim /etc/pan.d/login
​
sessionrequired/lib/security/pam_limits.so

这是告诉linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制,而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值,修改完后,保存文件。

  • 第三步,查看linux最大打开文件数限制
cat /proc/sys/fs/file-max
32568
​

这表明linux最大打开文件32568个文件,是linux系统硬限制,通常是linux启动时根据系统硬件资源计算出来的最大限制,没有特殊需求,不建议修改。修改此硬限制的方法是修改/etc/sysctl.conf文件内file-max=131072修改完后保存文件

完成上述步骤后,重启系统,ulimit -n查看修改的打开文件数

通过上述步骤就,就为支持高并发tcp连接处理的通讯处理程序解除关于打开文件数量方面的系统限制。

内核tcp参数方面

linux下,tcp连接断开后,会以TIME_WAIT状态保存一段时间,然后才会释放端口,当请求过多时,会产生大量的TIME_WAIT状态的连接,不及时断开的话,会占用大量的资源,我们可以优化tcp内核参数,来即使将TIME_WAIT状态的端口清理掉

本方法只对大量拥有TIME_WAIT状态的系统有效,如果不是效果不太明显,可使用netstat命令查看

编辑配置文件/etc/systcl.conf,加入如下内容

vim /etc/systcl.conf
​
net/ipv4/tcp_syncookies=1  #表示开启SYNcookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量的SYN攻击,默认为0,表示关闭
net/ipv4/tcp_tw_reuse=1  #表示开启重用,允许将处于TIME-WAIT状态的socket(TIME-WAIT的端口)用于新的TCP连接 默认为0表示关闭。
net/ipv4/tcp_fin_timeout=30  #修改默认TIME OUT时间为30秒

输入下面的参数让内核参数生效

sysctl-p

经过修改,会进一步提升服务器的负载能力,还能防御少量的syn攻击,和dos攻击

如果本身连接很多,可以优化一下tcp的使用端口范围

I/O事件分配

在linux启用高并发tcp连接,必须确认应用程序是否使用了合适的网络I/O技术和I/O事件分配机制,可用的I/O机制有:同步I/O,异步I/O非阻塞同步I/O。在高tcp并发下,如果使用同步I/0,会严重阻塞程序的运行,除非为每个tcp连接的I/O创建一个线程,过多的线程对线程的调度造成巨大的开支。因此不使用同步I/O。

异步I/O技术AIO

非阻塞同步I/O技术包括:select();poll();epoll等机制,select()支持的并发连接数量有限(1024以内),poll()采取轮训机制,效率相当低,可能存在分配不均,

而如果使用epoll()或AIO没有上述问题

综上所述,尽量使用epoll()或AIO技术来实现高并发tcp连接上的I/O控制。

以上配置仅供参考,实际情况根据工作进行调整观察。