关于CPU的调优:
查看CPU的命令:top 动态查看CPU的使用率,但是Top本身比较耗CPU,尽量少用,top -bn1每秒查看一次CPU;sar轻量级的,sar -p 1 2 每一秒查看一次共两次,可查看CPU的使用率和负载,此命令可帮助调优,man sar查看帮助; st 被偷走的CPU
JDK的调优:
JVM内存优化
vim bin/catalina.sh #配置文件
CATALINA_OPTS="-server -Xms128m -Xmx512m"
或
JAVA_OPTS="$JAVA_OPTS -Xms4096m -Xmx4096m -XX:PermSize=1024m -XX:MaxPermSize=2048m"
验证:ps -ef |grep java
-server:表示这是应用于服务器的配置,JVM 内部会有特殊处理的
-Xmx1024m:设置JVM最大堆可用内存为1024MB
-Xms1024m:设置JVM最小内堆存为1024m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-XX:NewSize:设置新生代大小
-XX:MaxNewSize:设置最大的新生代大小
-XX:PermSize:设置永久代大小
-XX:MaxPermSize:设置最大永久代大小
-XX:NewRatio=4:设置年轻代(包括 Eden 和两个 Survivor 区)与终身代的比值(除去永久代)。设置为 4,则年
轻代与终身代所占比值为 1:4,年轻代占整个堆栈的 1/5
-XX:MaxTenuringThreshold=10:设置垃圾最大年龄,默认为:15。如果设置为 0 的话,则新生代对象不经过 Survivor 区,直接进入年老代。对于老年代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻
代对象会在 Survivor 区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
+XX:+DisableExplicitGC:这个将会忽略手动调用 GC 的代码使得 System.gc() 的调用就会变成一个空调用,完全不
会触发任何 GC
新生代:主要存放的是那些很快就会被回收的或者不是特别大的对象,(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了) 新生代的复制算法即将新生代分为三个区:较大的Eden区和两个较小的Survivor(默认的Eden :Survivor = 8:1);发生新生代的GC为Minor GC(新生代垃圾收集器) ,新生代会将还存活着的对象复制进一个新的Survivor(生存的活着的)中,然后对Eden和另一个Survivor进行清理。所以,平常设置的新生代的大小为Eden的大小+一个Survivor的大小,当新生代的存活对象大于Survivor的大小时就会进入老年代。还有一种情况,如果设置了-XX:PretenureSizeThreshold3M 那么大于3M的对象就会直接就进入老年代。
在新生代的每一次Minor GC 都会给在新生代中的对象+1岁,默认到15岁时就会从新生代进入老年代,可以通过-XX:MaxTenuringThreshold来设置这个临界点。
老年代:一些运行时间比较短的进程,进程在短时间还没断开的(或者说是没有彻底释放内存的进程)就放在老年代里,还有经历好几次回收仍然活着的进程或者特别大的对象(这个大就要看你是否设置了-XX:PretenureSizeThreshold 参数了) 老年代采取的是标记-清除或者标记-整理的方式,这种算法主要是看虚拟机采用的哪种收集器 标记-清除可能会产生大量的内存碎片,在老年代中的GC为Major GC (老年代垃圾收集器回收速度比较慢)。在老年代中的对象比新生代中的对象不易回收许多。
永久代:永远不变的 不会被清除的 比如全局变量 、函数体等不变的东西;
JVM的方法区,也被称为永久代。在这里都是放着一些被虚拟机加载的类信息,静态变量,常量等数据。这个区中的东西比老年代和新生代更不容易回收。
垃圾回收机制:进程和服务器断开连接后内存里还有缓存,程序结束之前一直占用内存导致不能分配给其他对象 ,垃圾回收就是清理缓存 ,将有用的数据复制到另一个新区 遍历新区里的内容 将新区里的东西过滤掉 过段时间新区的东西也满了以后,垃圾回收机制也会将此区里的东西复制到另一个新区。 来回倒 ,按需设置定期的垃圾回收时间, 回收时间和基本信息都会记录到日志里 ,垃圾回收意味着程序不再需要的对象便是"无用信息",这些信息将被丢弃。
Tomcat的并发调优:
Tomcat配置文件conf/server.xml中 :
minProcessors: 最小空闲连接线程数,用于提高系统处理性能,默认值为 10
maxProcessors: 最大空闲连接线程数,即:并发处理的最大请求数,默认值为 75
acceptCount: 允许的最大连接数,应大于等于 maxProcessors ,默认值为 100
enableLookups: 是否反查域名,取值为: true 或 false 。为了提高处理能力,应设置为 false connectionTimeout: 网络连接超时,单位:毫秒。设置为 0 表示永不超时,这样设置有隐患的。通常可设置为 30000 毫秒。
其中和最大连接数相关的参数为maxProcessors 和 acceptCount 。如果要加大并发连接数,应同时加大这两个参数。
web server允许的最大连接数还受制于操作系统的内核参数设置,通常 Windows 是 2000 个左右, Linux 是 1000 个左右。
maxThreads 客户请求最大线程数
minSpareThreads Tomcat初始化时创建的 socket 线程数
maxSpareThreads Tomcat连接器的最大空闲 socket 线程数
enableLookups 若设为true, 则支持域名解析,可把 ip 地址解析为主机名
redirectPort 在需要基于安全通道的场合,把客户请求转发到基于SSL 的 redirectPort 端口
acceptAccount 监听端口队列最大数,满了之后客户请求会被拒绝(不能小于maxSpareThreads
connectionTimeout 连接超时
minProcessors 服务器创建时的最小处理线程数
maxProcessors 服务器同时最大处理线程数
URIEncoding URL统一编码
Tomcat Connector运行模式优化:
Tomcat Connector有三种运行模式:
bio:阻塞IO bio是三种运行模式中性能最低第一种。
nio:是一个基于缓冲区,并能提供非阻塞I/O操作的JAVA API 因此NIO也成为非阻塞I/O,比bio拥有更好的并发性能。
apr:调用httpd核心链接库来读取或文件传输,从而提高tomat对静态文件的处理性能。Tomcat APR模式也是Tomcat在高并发下的首选运行模式
Nginx的调优:
实际调优总结点:
1、动静访问分离:正常的网页服务器不仅仅是HTTP POST一个请求处理,还有很多有关静态的png/css/js等等静态网页的加载,为了减少服务器不必要的负担,我们可以使用squid Varnish nginx cache(nginx高速缓存器)等这些静态加速器。
静态处理交给NGINX:
location ~ ..(gif|jpg|jpeg|png|bmp|swf|css|js|html|htm)$ {
#root /home/webos/sam/html;
proxy_pass http://localhost ; #反向代理的ip地址
#proxy_pass http://squid3server ;
##proxy_set_header Host $host;
##proxy_set_header X-Real-IP $remote_addr;
##proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off; #将被代理服务器的响应头中的location字段进行修改后返回给客户端
proxy_set_header Host $host; #捕捉客户端访问服务器的真实 IP
proxy_cache cache_one;
proxy_cache_valid 200 302 1h;
proxy_cache_valid 301 1d;
proxy_cache_valid any 1m;
expires 30d; #到期时间
}
#动态文件不处理:
location ~ .$ {
proxy_pass http://127.0.0.1:8080;
proxy_cookie_path /nginx1/ /;
}
2、 nginx代理服务器的nginx.conf 配置优化:
a) worker_processes 4; 开启的工作进程最好与你的硬件CPU个数一致,一味的加大processes,会使得系统的切换开销增大得不偿失;
b) worker_rlimit_nofile 20000; nginx进程打开最多文件描述符数目,与ulimit -n的值保持一致就好
(ulimit -n 这个数字说明了一个普通用户能够在一个单独会话中所能打开最大的文件数目。
注意:如果是root,以下操作不能使ulimit -n的输出增加。因为用户root用户不受这个ulimit限制。只有普通用户才会受这个限制。
修改方法 /etc/security/limits.conf 修改
- soft nofile 20000 hard nofile 20000
修改openfiles配置文件永久修改:vim /etc/profile 添加 ulimit -SHn 65535 #在报文件数量不足的时候
修改file-max (系统所有进程一共可有打开的文件数量)系统级别的
配置文件 vim /etc/sysctl/cong 添加 fs.file-max=65535 )
c) proxy_connect_timeout 180; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 180; #后端服务器数据回传时间(代理发送超时)
proxy_send_timeout 180; #连接成功后,后端服务器响应时间(代理接收超时)
//将nginx与后端的tomcat连接超时,上行超时,下行超时的时间都设置的尽量大,防止大并发的情况下出现502 504.
d) useepoll //epoll是多路复用IO中的一种方式,应用于linux2.6以上内核,可以大大提高nginx的性能。
e) worker_connections 102400 //每个进程允许的最多连接数,最大连接数=连接数进程数
f) keepalive_timeout 90 //keepalive超时时间,客户端到服务器端的连接持续有效时间,当出现对服务器的后继请求时,keeplive-timeout功能可避免建立或重新建立连接,节省服务器资源、CPU、内存、网卡。服务器在这个超时时间后会关闭链接,我们将它设置低些可以让nginx持续工作时间更长,一般不超过120秒。
g) gzip on;
gzip_min_length 1k;
gzip_buffers416k;
gzip_http_version 1.1;
gzip_comp_level 4:
//开启gzip压缩,nginx可以采用gzip压缩的形式发送数量,减少我们发送的数据量。并修改压缩级别大小,最大为9,值越小,压缩后比例越小,CPU处理更快,级别设置为4最适宜。
f) open_file_cache_valid 80s //这个是指多长时间检查一次缓存的有效信息。
h) open_file_cache max=65535 inactive=60s //这个将为文件制定缓存,默认是没有启动的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。
3、进一步的nginx与tomcat优化点
nginx 与后端的服务器连接默认是使用的http 1.0,这个大家应该都了解,如果设置为HTTP1.1 复用链接的话就会大大降低了tcp开销,节省系统资源
upstream nginx_test {
server 192.168.128.128:8080 weight=5;
server 192.168.128.132:8080 weight=5;
keepalive 20;
设置持久连接时间。
}
server {
location / {
proxy_http_version 1.1;
#开启对http1.1支持
proxy_set_header Connection "";
设置Connection为空串,以禁止传递头部到后端;#http1.0中默认值Connection: close
proxy_pass http://nginx_test;
}
}
PHP相关优化:
/usr/local/php/lib/php.ini php配置目录下:
sed -i '/date.timezone =/s/./date.timezone = PRC/g' /usr/local/php/lib/php.ini
sed -n '868p' /usr/local/php/lib/php.ini
sed -i '/opcache]/azend_extension=opcache.so' /usr/local/php/lib/php.ini
sed -i '/;opcache.enable=1/s/;//g' /usr/local/php/lib/php.ini
sed -i '/opcache.enable_cli=/s/./opcache.enable_cli=1/g' /usr/local/php/lib/php.ini
echo "vm.nr_hugepages = 200" >> /etc/sysctl.conf
sysctl -p
sed -i '/;opcache.huge_code_pages/s/;//g' /usr/local/php/lib/php.ini
sed -i '/opcache.memory_consumption=/s/./opcache.memory_consumption=512/g'
/usr/local/php/lib/php.ini
sed -i '/opcache.fast_shutdown=/s/./opcache.fast_shutdown=1/g'
/usr/local/php/lib/php.ini
sed -i '/opcache.validate_timestamps=/s/./opcache.validate_timestamps=1/g'
/usr/local/php/lib/php.ini
sed -i '/opcache.revalidate_freq=/s/./opcache.revalidate_freq=2/g'
/usr/local/php/lib/php.ini
sed -i '/listen = 127.0.0.1/s/=.*/= 0.0.0.0:9000/g' /usr/local/php/etc/php-fpm.d/www.conf
MYSQL相关调优:
并发连接控制
连接数、连接超时
max_connections //允许的最大并发连接数
connect_timeout //等待建立连接的超时秒数,默认10秒,只在登录时有效
wait_timeout //等待关闭连接的不活动超时秒数,默认28800秒(8小时)
-产看当前已使用的连接数
mysql>flush status;
mysql>show globale status like "max_used_connections";
-查看默认的最大连接数
mysql>show variables like "max_connections";
-缓存参数控制
缓存区、线程数量、开表数量
key_buffer_size //用于MyISAM引擎的关键索引缓存大小
sort_buffer_size //为每个要排序的线程分配此大小的缓存空间
read_buffer_size //为顺序读取表记录保留的缓存大小
read_rnd_buffer_size //为按排序结果读取表记录保留的缓存大小
thread_cache_size //允许保存在缓存中被重用的线程数量
table_open_cache //为所有线程缓存的打开的表的数量
key_buffer_size=8M
当key_reads/key_read_requests较低时可适当加大此缓存值
mysql>show global status like "key_read%";
mysql>show variables like "key_buffer_size";
sort_buffer_size=256K
增大此值可提高ORDER和GROUP的速度
mysql>show variables like "sort_buffersize";
查看表记录读取缓存
-此缓存值影响SQL查询的响应速度
mysql>show variables like "read%size";
查看可重用线程
mysql>show variables like "thread%size";
查看当前的线程重用状态
mysql>show global status like "threads%";
查看已打开、打开过多少个表
mysql>show global status like "open%tables";
查看可缓存多少个打开的表
mysql>show variables like "table_open_cache";
SQL查询优化
MySQL日志类型,常用日志种类及选项:
错误日志 log_error[=name] //记录启用/运行/停止过程的错误消息
查询日志 general_log,general_log_file= //记录客户端连接和查询操作
慢查询日志 slow_query_log,slow_query_log_file=,long_query_time= //记录耗时较长或不使用索引的查询操作
记录慢查询:
slow-query-log //启用慢查询
slow-query-log-file //指定慢查询日志文件
long-query-time //超过指定秒数(默认10秒)的查询才被记录
log-queries-not-using-indexes //记录未使用索引的查询
调整服务配置:
vim /etc/my.cnf
[mysqld]
...
slow_query_log=1
slow_query_log_file=mysql-slow.log
long_query_time=5
log_queries_not_using_indexes=1
systemctl restart mysqld
查看慢查询日志,使用mysqldumpslow工具
mysqldumpslow /var/lib/mysql/mysql-slow.log
查看缓存的大小
mysql>show variables like "query_cache%";
查看当前的查询缓存统计
mysql>show global status like "qcache%";
主从复制阻塞(延迟)方面:
–slave-net-timeout=seconds
参数含义:当slave从主数据库读取log数据失败后,等待多久重新建立连接并获取数据
slave_net_timeout单位为秒 默认设置为 3600秒
| slave_net_timeout | 3600
–master-connect-retry=seconds
参数含义:当重新建立主从连接时,如果连接建立失败,间隔多久后重试。
master-connect-retry单位为秒 默认设置为 60秒
通常配置以上2个参数可以减少网络问题导致的主从数据同步延迟