linux 操作系统优化
系统优化除了CPU、网络、磁盘IO,内存等硬件支撑外,内核参数优化尤为重要,Linux服务器内核参数优化(适合Apache、Nginx、Squid等多种web应用,特殊的业务有可能需要做略微调整),主要是指在Linux系统中针对业务服务应用而进行的系统内核参数调整,优化并无一定的标准。下面是生产环境下Linux常见的内核优化为例子进行说明,供大家参考。
vi /etc/sysctl.conf //编辑配置文件
sysctl –p //使配置生效
net.core.netdev_max_backlog = 400000
net.core.optmem_max = 10000000 net.core.rmem_default = 10000000 net.core.rmem_max = 10000000 net.core.somaxconn = 65535 net.core.wmem_default = 11059200 net.core.wmem_max = 11059200 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.tcp_congestion_control = bic net.ipv4.tcp_window_scaling = 0 net.ipv4.tcp_ecn = 0 net.ipv4.tcp_sack = 1 net.ipv4.tcp_max_tw_buckets = 10000 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_wmem = 30000000 30000000 30000000 net.ipv4.ip_local_port_range = 1024 65000 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.route.gc_timeout = 100 net.ipv4.tcp_syn_retries = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.ipv4.conf.default.accept_source_route = 0 #以下参数是对iptables防火墙的优化,防火墙不开会提示,可以忽略不理 net.nf_conntrack_max = 25000000 net.netfilter.nf_conntrack_tcp_timeout_established = 180 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120 net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60 net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120 |
3.2 Web中间件优化
3.2.1 Nginx优化
一般来说nginx 配置文件中对优化比较有作用的为以下几项:
1. worker_processes 8;
nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8)。
2. worker_rlimit_nofile 65535;
这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文
件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
3.use epoll;
使用epoll 的I/O 模型
4.worker_connections 65535;
每个进程允许的最多连接数, 理论上每台nginx 服务器的最大连接数为worker_processes*worker_connections。
5.keepalive_timeout 60;
keepalive 超时时间。
6. client_header_buffer_size 4k;
客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。
7.open_file_cache max=65535 inactive=60s;
这个将为打开文件指定缓存,默认是没有启用的,max 指定缓存数量,建议和打开文件数一致,inactive 是指经过多长时间文件没被请求后删除缓存。
8. open_file_cache_valid 80s;
这个是指多长时间检查一次缓存的有效信息。
9. open_file_cache_min_uses 1;
open_file_cache 指令中的inactive 参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive 时间内一次没被使用,它将被移除。
3.2.1.1优化实例
worker_processes auto;
worker_rlimit_nofile 100000; events { worker_connections 65535; multi_accept on; use epoll; } |
3.2.2 tomcat优化
1、 修改内存等 JVM相关配置
Linux下修改TOMCAT_HOME/bin/catalina.sh
JAVA_OPTS="-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m windows下修改TOMCAT_HOME/bin/catalina.bat set JAVA_OPTS=-server -XX:PermSize=512M -XX:MaxPermSize=1024m -Xms2048m -Xmx2048m 时区优化 JAVA_OPTS="$JAVA_OPTS -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Duser.timezone=GMT+08"
|
参数说明:
-server:启用 JDK的 server 版本;
-Xms:Java虚拟机初始化时堆的最小内存,一般与 Xmx配置为相同值,这样的好处是GC不必再为扩展内存空间而消耗性能; -Xmx:Java虚拟机可使用堆的最大内存; -XX:PermSize:Java虚拟机永久代大小; -XX:MaxPermSize:Java虚拟机永久代大小最大值; |
Ø 错误提示:java.lang.OutOfMemoryError:Java heap space
Tomcat默认可以使用的内存为128MB,在较大型的应用项目中,这点内存是不够的,有可能导致系统无法运行。常见的问题是报Tomcat内存溢出错误,Outof Memory(系统内存不足)的异常,从而导致客户端显示500错误,一般调整Tomcat的-Xms和-Xmx即可解决问题,通常将-Xms和-Xmx设置成一样,堆的最大值设置为物理可用内存的最大值的80%。
set JAVA_OPTS=-Xms512m-Xmx512m
Ø 错误提示:java.lang.OutOfMemoryError: PermGenspace
PermGenspace的全称是Permanent Generationspace,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGenspace中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGenspace进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行precompile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。解决方法:
setJAVA_OPTS=-XX:PermSize=128M
Ø 在使用-Xms和-Xmx
调整tomcat的堆大小时,需要考虑垃圾回收机制。如果系统花费很多的时间收集垃圾,请减小堆大小。一次完全的垃圾收集应该不超过3-5 秒。如果垃圾收集成为瓶颈,那么需要指定代的大小,检查垃圾收集的详细输出,研究垃圾收集参数对性能的影响。一般说来,应该使用物理内存的 80% 作为堆大小。当增加处理器时,记得增加内存,因为分配可以并行进行,而垃圾收集不是并行的。
2、Connector 优化
Connector是连接器,负责接收客户的请求,以及向客户端回送响应的消息。所以 Connector的优化是重要部分。默认情况下 Tomcat只支持200线程访问,超过这个数量的连接将被等待甚至超时放弃,所以我们需要提高这方面的处理能力。
参数说明:
maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数 maxSpareThreads Tomcat连接器的最大空闲 socket 线程数 enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名 redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口 acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads ) connectionTimeout 连接超时 minProcessors 服务器创建时的最小处理线程数 maxProcessors 服务器同时最大处理线程数 URIEncoding URL统一编码
|
2、 缓存优化
参数说明
compression 打开压缩功能
compressionMinSize 启用压缩的输出内容大小,这里面默认为2KB
compressableMimeType 压缩类型
connectionTimeout 定义建立客户连接超时的时间. 如果为 -1, 表示不限制建立客户连接的时间
3、 使用线程池
在server.xml中增加executor节点,然后配置connector的executor属性,如下:
<Executor name="tomcatThreadPool" namePrefix="req-exec-"maxThreads="1000" minSpareThreads="50"maxIdleTime="60000"/>
<Connector port="8080" protocol="HTTP/1.1"executor="tomcatThreadPool"/> |
参数说明
namePrefix:线程池中线程的命名前缀
maxThreads:线程池的最大线程数 minSpareThreads:线程池的最小空闲线程数 maxIdleTime:超过最小空闲线程数时,多的线程会等待这个时间长度,然后关闭 threadPriority:线程优先级 |
4、 NIO模式
Ø BIO:一个线程处理一个请求。缺点:并发量高时,线程数较多,浪费资源。Tomcat7或以下在Linux系统中默认使用这种方式。
Ø NIO:利用Java的异步IO处理,可以通过少量的线程处理大量的请求。Tomcat8在Linux系统中默认使用这种方式。Tomcat7必须修改Connector配置来启动(conf/server.xml配置文件):
<Connector port="8080"protocol="org.apache.coyote.http11.Http11NioProtocol" connectionTimeout="20000"redirectPort="8443"/> |
Ø APR(Apache Portable Runtime):从操作系统层面解决io阻塞问题。Linux如果安装了apr和native,Tomcat直接启动就支持apr。
3.2.2.1优化实例
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000" maxThreads="1000" minSpareThreads="100" maxSpareThreads="1000" minProcessors="100" maxProcessors="1000" enableLookups="false" URIEncoding="utf-8" acceptCount="1000" redirectPort="8443" compression="on" compressionMinSize="2048" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" disableUploadTimeout="true" maxPostSize="-1" maxHttpHeaderSize="8192" /> |
protocol=”org.apache.coyote.http11.Http11NioProtocol” ,表示以 NIO模式启动。
3.3 数据库优化
选项 | 默认值 | 说明 | 是否优化 | 原因 |
max_connections | 100 | 允许客户端连接的最大数目
超过2000报错时:执行 echo 250 250000 32 1000 >/proc/sys/kernel/sem sysctl -p 修改max_connection = 10000 | 是 | 1500
最大连接数= used_connections/max_connections在85%左右 连接池数 = ((核心数 * 2) + 有效磁盘数) |
fsync | on | 强制把数据同步更新到磁盘 | 是 | 因为系统的IO压力很大,为了更好的测试其他配置的影响,把改参数改为off |
shared_buffers | 24MB | 决定有多少内存可以被PostgreSQL用于缓存数据(推荐内存的1/4) | 是 | 在IO压力很大的情况下,提高该值可以减少IO |
work_mem | 1MB | 使内部排序和一些复杂的查询都在这个buffer中完成 | 是 | 有助提高排序等操作的速度,并且减低IO |
effective_cache_size | 128MB | 优化器假设一个查询可以用的最大内存,和shared_buffers无关(推荐内存的1/2) | 是 | 设置稍大,优化器更倾向使用索引扫描而不是顺序扫描 |
maintenance_work_mem | 16MB | 这里定义的内存只是被VACUUM等耗费资源较多的命令调用时使用 | 是 | 把该值调大,能加快命令的执行 |
wal_buffer | 768kB | 日志缓存区的大小 | 是 | 可以降低IO,如果遇上比较多的并发短事务,应该和commit_delay一起用 |
checkpoint_segments | 3 | 设置wal log的最大数量数(一个log的大小为16M) | 是 | 默认的48M的缓存是一个严重的瓶颈,基本上都要设置为10以上 |
checkpoint_completion_target | 0.5 | 表示checkpoint的完成时间要在两个checkpoint间隔时间的N%内完成 | 是 | 能降低平均写入的开销 |
commit_delay | 0 | 事务提交后,日志写到wal log上到wal_buffer写入到磁盘的时间间隔。需要配合commit_sibling | 是 | 能够一次写入多个事务,减少IO,提高性能 |
commit_siblings | 5 | 设置触发commit_delay的并发事务数,根据并发事务多少来配置 | 是 | 减少IO,提高性能 |
autovacuum_naptime | 1min | 下一次vacuum任务的时间 | 是 | 提高这个间隔时间,使他不是太频繁 |
autovacuum_analyze_threshold | 50 | 与autovacuum_analyze_scale_factor配合使用,来决定是否analyze | 是 | 使analyze的频率符合实际 |
autovacuum_analyze_scale_factor | 0.1 | 当update,insert,delete的tuples数量超过autovacuum_analyze_scale_factor*table_size+autovacuum_analyze_threshold时,进行analyze。 | 是 | 使analyze的频率符合实际 |
timezone | Asia/Shanghai | 数据库时区,看情况是否需要修改成和jvm或本地时间一致,否则用数据库函数生成的时间不对应 |