Linux、mysql、tomcat大并发下的配置

康慧欣 2015-10-20

一、前言

因为之前一直没太接触过项目实现部署的问题,所以中间出现了N多问题,现在有时间了,做了一个整理,已备后用。此处不包括上一层服务器的负载,如使用nginx/apache等。

二、实现

mysql:

1.最大连接数:

配置项目中的连接池最大连接数<=mysql的max_connections(如项目有集群,则乘N)

可解决出现:MySQL提示Toomanyconnections(1040)

SELECT @@max_connections; -- 查看现有设置数量

临时解决方案:

set global max_connections = 3600; -- 重启后失效

最终解决方案:

1)首先修改/etc/my.cnf(Ubuntu10下为/etc/mysql/my.cnf)

Linux: vi /etc/my.cnf

2)在[mysqld]最后增加一行

max_connections=5000

3)重新启动mysql

Linux: service mysqld start

2.序列

非主键的WHERE条件,则可增加序列。

3.数据类型

相关联的两表中的相同字段长度要一致,mysql取值如果满足可用占用空间小的,如tinyint、smallint等等

tomcat:

catalina.sh在cygwin=false前面添加

JAVA_OPTS="-server -Xms512M -Xmx512M -Xss256K -Djava.awt.headless=true -Dfile.encoding=utf-8 -XX:PermSize=64M -XX:MaxPermSize=128m"

server.xml

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="1000" minSpareThreads="350" />
<Connector port="8080"
        protocol="org.apache.coyote.http11.Http11NioProtocol" // NIO
        executor="tomcatThreadPool" // Executor 线程池
        compression="on"
        compressionMinSize="2048"
        maxThreads="30000" //设定处理客户请求的线程的最大数目,决定了服务器可以同时响应客户请求的数,默认200
        minSpareThreads="512" //初始化线程数,最小空闲线程数,默认为10
        maxSpareThreads="2048"
        enableLookups="false" //关闭DNS反向查询,性能高设false
        redirectPort="8443"
        acceptCount="35000" //当所有可以使用的处理请求的线程数都被使用时,可以被放到处理队列中请求数,请求数超过这个数的请求将不予处理,默认100
        debug="0"
        connectionTimeout="40000"
        disableUploadTimeout="true" URIEncoding="UTF-8" useBodyEncodingForURI="true" />
引用
APR配置方式可参考:http://www.linuxidc.com/Linux/2015-09/123076.htm

配置误区对比和解读:http://www.linuxidc.com/Linux/2013-09/90332.htm

linux:

查询ulimit命令
# 显示当前所有的 limit 信息
Linux: ulimit -a
# Linux操作系统对一个进程可以打开最大文件描述符的数量
Linux: ulimit -n
# 用户最大可用的进程数
Linux: ulimit -u

1.句柄数:ulimit-n

问题:Can’topensomanyfiles

临时解决方案:
ulimit -SHn 65535

最终解决方案,在/etc/security/limits.conf文件中设置最大打开文件数添加:

Linux: vi /etc/security/limits.conf
# *代表针对所有用户
*      soft    nofile        65535       
*      hard    nofile        65535

最后用重启ulimit-a再次查看,openfiles的值,如果改过来,则生效。

2.用户进程数:ulimit-u

比如我们在模拟大规模http并发测试的时候,客户端会报一个无法forknewproc异常,原因是受到了最大进程1024的限制,解除Linux系统的最大进程数

解决方案:修改/etc/security/limits.d/90-nproc.conf

Linux: vim /etc/security/limits.d/90-nproc.conf
# 添加如下的行
*          soft    nproc     102400
root       soft    nproc     102400

3.网络参数

修改/etc/sysctl.conf文件,增加如下内容

Linux: vim /etc/sysctl.conf
net.core.netdev_max_backlog = 32768 
net.core.somaxconn = 32768 
net.core.wmem_default = 8388608 
net.core.rmem_default = 8388608 
net.core.rmem_max = 16777216 
net.core.wmem_max = 16777216 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.route.gc_timeout = 100 
net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_timestamps = 0 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_syn_retries = 2 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_mem = 94500000 915000000 927000000 
net.ipv4.tcp_max_orphans = 3276800 
net.ipv4.tcp_max_syn_backlog = 65536

保存退出,执行sysctl命令,重新加载内核参数立刻生效

Linux: sysctl -p
引用

net.ipv4.tcp_syncookies=1表示开启SYNCookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse=1表示开启重用。允许将TIME-WAITsockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME-WAITsockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout=30表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_keepalive_time=1200表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。

net.ipv4.ip_local_port_range=102465000表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.tcp_max_syn_backlog=8192表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_tw_buckets=5000表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

http://www.jb51.net/article/37835.htm

引用
并发测试详解:https://gitsea.com/2013/07/02/tomcat-%E5%B9%B6%E5%8F%91%E4%BC%98%E5%8C%96/

ulimit详解:https://gitsea.com/2013/05/23/linux-ulimit%E8%AF%A6%E8%A7%A3/

相关推荐