linux tomcat mysql nginx性能优化记录

java 搜索解决方案和实现 需求分析 解决方案 方案实现

linux tomcat mysql nginx性能优化记录

linux : centos6.3 64位

系统信息查看

首先查看操作系统信息,cpu内核数量,操作系统位数。

uname -a 可以看到操作系统位数

cat /proc/cpuinfo |grep 'processor'|wc -l   查看操作系统内核数。 cat /proc/cpuinfo 查看cpu信息。

最大文件句柄数修改

ulimit -a 查看相关限制,max open files,可以用ulimit -n 100000 设置max open files.持久更改方法如下:

cat /proc/sys/fs/file-max   查看操作系统文件最大句柄数。

vi /etc/security/limits.conf  根据注释添加相关参数,如下: *表示所有用户,可以写成root,nginx,mysql等,格式看注释。

* soft nofile 100000
* hard nofile 100000
* soft nproc 100000
* hard nproc 10000

 

如何生效:重先登录后生效。用exit,不要直接关闭窗口。再查看ulimit -a 时配置生效。

内核相关参数修改

可以参考 http://michaelkang.blog.51cto.com/1553154/1074318

vim /etc/sysctl.conf

配置生效 : sysctl -p    #可以 man sysctl看下说明 -p表示加载配置文件,默认位置为/etc/sysctl.conf,如果相关参数有错误,运行命令时会有提示,需要根据实际情况更改。

示例配置如下:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_abort_on_overflow = 1
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096  87380   4194304
net.ipv4.tcp_wmem = 4096  66384   4194304
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.core.optmem_max = 81920
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.ipv4.tcp_max_syn_backlog = 10200
net.core.netdev_max_backlog = 862144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 327680
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 15
net.ipv4.ip_local_port_range = 10001    65000

tomcat优化(tomcat7.0)

官方下载tomcat7最新版本,jdk7 64位。

APR安装

官方网站   http://apr.apache.org/    http://tomcat.apache.org/tomcat-7.0-doc/apr.html

作用主要是socket调度。

Requirements:

  • APR 1.2+ development headers (libapr1-dev package)  apr apr-util 下载源码安装
  • OpenSSL 0.9.7+ development headers (libssl-dev package) openssl   yum install openssl (https时需要)
  • JNI headers from Java compatible JDK 1.4+
  • GNU development environment (gcc, make) gcc

先安装apr.解压

./configure

make 

make install

安装过程会显示目录: /usr/local/apr/bin/apr-1-config

安装apr-util   

./configure –with-apr=/usr/local/apr/bin/apr-1-config

make && make install.

tomcat native 编译安装和配置

解压tomcat bin目录下tomcat-native*.tar.gz。

目录类似  /home/content-web/apache-tomcat-7.0.50/bin/tomcat-native-1.1.29-src/jni/native

./configure –help 查看参数设置。–with-apr是需要的。

./configure –with-apr=/usr/local/apr/bin/apr-1-config –with-java-home=/home/content-web/jdk1.7.0_45/

/usr/local/apr/lib/ 为编译后文件。

bin/catalina.sh文件中增加一 行:

CATALINA_OPTS="-Djava.library.path=/usr/local/apr/lib"   #设置apr环境变量。

编辑tomcat server.xml关闭ssl:

 <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="off" />

 

如果需要,要在编译tomcat-native时指定openssl路径。

启动tomcat,apr日志输出如下:

Feb 25, 2014 2:15:10 PM org.apache.catalina.core.AprLifecycleListener init
INFO: Loaded APR based Apache Tomcat Native library 1.1.29 using APR version 1.5.0.
Feb 25, 2014 2:15:10 PM org.apache.catalina.core.AprLifecycleListener init
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
Feb 25, 2014 2:15:11 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [“http-apr-9180”]

 

加大线程池处理:server.xml示例配置如下:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
        maxThreads="8000" minSpareThreads="5000"/>
    <Connector port="9180" protocol="HTTP/1.1"
      executor="tomcatThreadPool"        connectionTimeout="30000" redirectPort="8543" />

其中maxThreads为最大线程数,minSpareThreads为初始线程数,空闲时线程数。

mysql配置优化

查看mysql安装目录下面的配置示例进行优化处理(mysql5.1.53):

skip-locking
key_buffer_size = 384M
max_allowed_packet = 1M
default-character-set=utf8
init_connect='SET NAMES utf8'
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
max_connections=6000

 

另外可以升级mysql到5.6版本。

ngnix优化

参照: http://blog.sina.com.cn/s/blog_561159790101dd6g.html

worker_processes 8;

  nginx进程数,建议按照cpu数目来指定,一般为它的倍数。

 

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

  为每个进程分配cpu,上例中将8个进程分配到8个cpu,当然可以写多个,或者将一个进程分配到多个cpu。

 

worker_rlimit_nofile 102400;

  这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n的值保持一致。

 

use epoll;

  使用epoll的I/O模型,这个不用说了吧。

 

worker_connections 102400;

  每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为worker_processes*worker_connections。

 

keepalive_timeout 60;

  keepalive超时时间。

 

client_header_buffer_size 4k;

  客户端请求头部的缓冲区大小,这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

 

open_file_cache max=102400 inactive=20s;

  这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

 

open_file_cache_valid 30s;

  这个是指多长时间检查一次缓存的有效信息。

 

open_file_cache_min_uses 1;

  open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

 

内核参数的优化

net.ipv4.tcp_max_tw_buckets = 6000

  timewait的数量,默认是180000。

 

net.ipv4.ip_local_port_range = 1024    65000

  允许系统打开的端口范围。

 

net.ipv4.tcp_tw_recycle = 1

  启用timewait快速回收。

 

net.ipv4.tcp_tw_reuse = 1

  开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。

 

net.ipv4.tcp_syncookies = 1

  开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理。

 

net.core.somaxconn = 262144

  web应用中listen函数的backlog默认会给我们内核参数的net.core.somaxconn限制到128,而nginx定义的NGX_LISTEN_BACKLOG默认为511,所以有必要调整这个值。

 

net.core.netdev_max_backlog = 262144

  每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。

 

net.ipv4.tcp_max_orphans = 262144

  系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤儿连接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)。

 

net.ipv4.tcp_max_syn_backlog = 262144

  记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

 

net.ipv4.tcp_timestamps = 0

  时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种"异常"的数据包。这里需要将其关掉。

 

net.ipv4.tcp_synack_retries = 1

  为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量。

 

net.ipv4.tcp_syn_retries = 1

  在内核放弃建立连接之前发送SYN包的数量。

 

net.ipv4.tcp_fin_timeout = 1

  如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些。

 

net.ipv4.tcp_keepalive_time = 30

  当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

 

一个完整的内核优化配置

net.ipv4.ip_forward = 0

net.ipv4.conf.default.rp_filter = 1

net.ipv4.conf.default.accept_source_route = 0

kernel.sysrq = 0

kernel.core_uses_pid = 1

net.ipv4.tcp_syncookies = 1

kernel.msgmnb = 65536

kernel.msgmax = 65536

kernel.shmmax = 68719476736

kernel.shmall = 4294967296

net.ipv4.tcp_max_tw_buckets = 6000

net.ipv4.tcp_sack = 1

net.ipv4.tcp_window_scaling = 1

net.ipv4.tcp_rmem = 4096        87380   4194304

net.ipv4.tcp_wmem = 4096        16384   4194304

net.core.wmem_default = 8388608

net.core.rmem_default = 8388608

net.core.rmem_max = 16777216

net.core.wmem_max = 16777216

net.core.netdev_max_backlog = 262144

net.core.somaxconn = 262144

net.ipv4.tcp_max_orphans = 3276800

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_timestamps = 0

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000

net.ipv4.tcp_fin_timeout = 1

net.ipv4.tcp_keepalive_time = 30

net.ipv4.ip_local_port_range = 1024    65000

 

一个简单的nginx优化配置文件

user  www www;

worker_processes 8;

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000;

error_log  /www/log/nginx_error.log  crit;

pid        /usr/local/nginx/nginx.pid;

worker_rlimit_nofile 204800;

 

events

{

  use epoll;

  worker_connections 204800;

}

 

http

{

  include       mime.types;

  default_type  application/octet-stream;

 

  charset  utf-8;

 

  server_names_hash_bucket_size 128;

  client_header_buffer_size 2k;

  large_client_header_buffers 4 4k;

  client_max_body_size 8m;

 

  sendfile on;

  tcp_nopush     on;

 

  keepalive_timeout 60;

 

  fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2

                keys_zone=TEST:10m

                inactive=5m;

  fastcgi_connect_timeout 300;

  fastcgi_send_timeout 300;

  fastcgi_read_timeout 300;

  fastcgi_buffer_size 16k;

  fastcgi_buffers 16 16k;

  fastcgi_busy_buffers_size 16k;

  fastcgi_temp_file_write_size 16k;

  fastcgi_cache TEST;

  fastcgi_cache_valid 200 302 1h;

  fastcgi_cache_valid 301 1d;

  fastcgi_cache_valid any 1m;

  fastcgi_cache_min_uses 1;

  fastcgi_cache_use_stale error timeout invalid_header http_500;

  

  open_file_cache max=204800 inactive=20s;

  open_file_cache_min_uses 1;

  open_file_cache_valid 30s;

  

 

 

  tcp_nodelay on;

  

  gzip on;

  gzip_min_length  1k;

  gzip_buffers     4 16k;

  gzip_http_version 1.0;

  gzip_comp_level 2;

  gzip_types       text/plain application/x-javascript text/css application/xml;

  gzip_vary on;

 

 

  server

  {

    listen       8080;

    server_name  ad.test.com;

    index index.php index.htm;

    root  /www/html/;

 

    location /status

    {

        stub_status on;

    }

 

    location ~ .*\.(php|php5)?$

    {

        fastcgi_pass 127.0.0.1:9000;

        fastcgi_index index.php;

        include fcgi.conf;

    }

 

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|js|css)$

    {

      expires      30d;

    }

 

    log_format  access  '$remote_addr – $remote_user [$time_local] "$request" '

              '$status $body_bytes_sent "$http_referer" '

              '"$http_user_agent" $http_x_forwarded_for';

    access_log  /www/log/access.log  access;

      }

}

 

根据实际情况更改相关配置。

 

 

 

 

 

 


© 2018 java web asdtiang.蜀ICP备17041456号