⼀.分析思路
1.排除本机⾃⾝原因 2.服务器性能分析
3.项⽬本⾝分析(不详细说) 4.虚拟机分析 5.数据库分析⼆.详细分析⽅法1.排除本机⾃⾝原因
可以使⽤站长⼯具测试⽹站速度。
2.服务器性能分析
使⽤top命令查看服务器的资源使⽤情况,主要分析CPU和内存的使⽤情况(top 命令是 Linux 下常⽤的性能分析⼯具,能够实时显⽰系统中各个进程的资源占⽤状况,默认5秒刷新⼀下进程列表,所以类似于 Windows 的任务管理器。):
第三⾏显⽰的是Cpu的使⽤情况,详细含义如下:
us---⽤户空间占⽤CPU的百分⽐、sy---内核空间占⽤CPU的百分⽐、ni---改变过优先级的进程占⽤CPU的百分⽐、id---空闲CPU百分⽐、wa---IO等待占⽤CPU的百分⽐、hi---硬中断(Hardware IRQ)占⽤CPU的百分⽐、si---软中断(SoftwareInterrupts)占⽤CPU的百分⽐、st---Steal Time,分配给运⾏在主机上其它虚拟机的任务的实际CPU时间,⼀般只有在虚拟机OS。
第4⾏是当前的内存情况,服务器总内存8054352k,已使⽤2879468k,剩余5174884k,缓冲265728k。
我个⼈的理解是:当us的百分⽐⼩于50%时,是不需要去考虑服务器的配置问题的,如果服务器的us百分⽐长时间在70%以上时,可以考虑加强服务器的硬件配置。此外,还需要查看服务器的⽹络情况,下载⼀个⼤型⽂件基本就可以确定⽹络情况了。3.项⽬本⾝分析
如果使⽤JDBC连接池,需要对连接池的配置进⾏分析(分析线程池的最⼤数量和释放时间等等)。 这⾥以C3P0为例,下⾯是我曾经做的⼀个项⽬的配置,如下图:
这⾥本来只是本地测试的配置⽅案,由于粗⼼,上线后忘记修改了,当多⼈访问时,会出现等待连接超时的情况,我们需要根据项⽬的实际情况设定合适的配置数据。
还有可能项⽬的设计⽅⾯不合理导致响应缓慢,这⾥就不详细说明了。
checkoutTimeout---当连接池连接耗尽时,客户端调⽤getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则⽆限期等待。单位毫秒。默认: 0 minPoolSize---连接池中保留的最⼩连接数,默认为:3 maxPoolSize---连接池中保留的最⼤连接数。默认值: 15
maxIdleTime---最⼤空闲时间,设定时间内未使⽤则连接被丢弃。若为0则永不丢弃。默认值: 0
maxIdleTimeExcessConnections---default : 0 单位 s 这个配置主要是为了减轻连接池的负载,⽐如连接池中连接数因为某次数据访问⾼峰导致创建了很多数据连接 ,但是后⾯的时间段需要的数据库连接数很少,则此时连
接池完全没有必要维护那么多的连接,所以有必要将断开丢弃掉⼀些连接来减轻负载,必须⼩于maxIdleTime。配置不为0,则会将连接池中的连接数量保持到minPoolSize。为0则不处理
acquireIncrement---当连接池中的连接耗尽的时候c3p0⼀次同时获取的连接数。默认值: 34.虚拟机分析
使⽤top指令查看虚拟机的内存占⽤情况,有时候可以发现虽然虚拟机占⽤内存的百分⽐不⼤却有明显的上限值,我们就需要去查看虚拟机的配置情况。 解决⽅法(以tomcat为例):
具体的数值根据实际情况⽽定。5.数据库分析(MySql)
数据库的分析内容和需要考虑的⽅⾯有很多,这⾥只说本⼈遇到过的⼏种情况:a.最⼤连接数
show variables like '%max_connections%'; 查看最⼤连接数 show status like 'Threads%';当前连接的使⽤情况
Threads_connected---打开的连接数
Threads_running---这个数值指的是激活的连接数,这个数值⼀般远低于connected数值
如果最⼤连接数的值太⼩可以根据实际情况进⾏修改,⼀般修改为1000即可,设置⽅法有两种: 1.临时设置,重启服务后将失效
2.修改数据库配置⽂件
在/etc/my.cnf ⽂件的[mysqld]下增减⼀⾏:max_connections = 1000b.超时控制
mysql存在⼀项属性“wait_timeout”,默认值为28800秒(8⼩时),wait_timeout的值可以设定,但最多只能是2147483,不能再⼤了。也就是约24.85天 ,可以通过show global variables like 'wait_timeout';命令来查看。
wait_timeout的含义是:⼀个connection空闲超过8个⼩时,Mysql将⾃动断开该connection,通俗的讲就是⼀个连接在8
⼩时内没有活动,就会⾃动断开该连接。由于dbcp没有检验该connection是否有效,⽤其进⾏数据操作便会出现异常。 如果是由超时控制引起的问题,不建议修改wait_timeout的值,在数据库连接的url的后⾯加上“&autoReconnect=true&failOverReadOnly=false”即可解决。c.DNS反向解析
MySQL数据库收到⼀个⽹络连接后,⾸先拿到对⽅的IP地址,然后对这个IP地址进⾏反向DNS解析从⽽得到这个IP地址对应的主机名。⽤主机名在权限系统⾥⾯进⾏权限判断。反向DNS解析是耗费时间的,有可能让⽤户感觉起来很慢。甚⾄有的时候,反向解析出来的主机名并没有指向这个IP地址,这时候就⽆法连接成功了。 可以在配置⽂件⾥⾯禁⽌MySQL进⾏反向DNS解析,只需在my.cnf的[mysqld]段落中加⼊如下⾏即可: skip-name-resolve (windows与linux下⼀样的)d.表⾼速缓存
show global status like 'open%tables%';查看打开的表的数量:
open_tables:是当前在缓存中打开表的数量。 opened_tables:是mysql⾃启动起,打开表的数量。
当Opened_tables数值⾮常⼤,说明cache太⼩,导致要频繁地open table,可以查看下当前的table_open_cache设置: show variables like 'table_open_cache'; 查看缓存的上限值
设置table_open_cache的值有两种⽅式(如果是4G左右内存的服务器,建议设为2048): 1.临时设置,重启服务后将失效
set global table_open_cache=2048; 2.修改数据库配置⽂件
在/etc/my.cnf ⽂件的[mysqld]下增减⼀⾏:table_open_cache = 2048e.慢查询⽇志
记录的慢查询⽇志的⽬的是确认是否是由于某些语句执⾏缓慢⽽导致的服务器响应慢。 慢查询就不详细说了,⽹上可以查到很多。
不过,最后,根据我实际的项⽬分析,这些都没有问题,是MongoDb的CPU直接满了,注释掉就好了以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
因篇幅问题不能全部显示,请点此查看更多更全内容