本文转自自:https://www.cnblogs.com/yangc/p/6859985.html ,感谢给我提供提供思路。

服务器响应慢的分析与解决(Linux服务器)

一.分析思路

  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---软中断(Software Interrupts)占用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一次同时获取的连接数。默认值: 3

4.虚拟机分析

  使用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 = 1000

b.超时控制

  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 = 2048

e.慢查询日志

  记录的慢查询日志的目的是确认是否是由于某些语句执行缓慢而导致的服务器响应慢。

  慢查询就不详细说了,网上可以查到很多。

不过,最后,根据我实际的项目分析,这些都没有问题,是MongoDb的CPU直接满了,注释掉就好了,下一篇文章将会记录MongoDb的问题。

Linux 下Tomcat服务器响应越来越慢分分析的更多相关文章

  1. linux下tomcat服务器的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  2. Linux下Tomcat服务器重启与关闭

    Linux下Tomcat重新启动 详细请参照原网站链接http://www.cnblogs.com/tovep/articles/2473147.html 在Linux系统下,重启Tomcat使用命令 ...

  3. linux下tomcat服务器的启动和关闭以及查看实时打印日志

    本页面中的操作都在tomcat的bin目录下 <一> 一般我都是使用: ./shutdom.sh //关闭tomcat ./startup.sh //开启tomcat服务 <二> ...

  4. linux下http服务器开发

    linux下http服务器开发 1.mystery引入 1)超文本传输协议(HTTP)是一种应用于分布式.合作式.多媒体信息系统的应用层协议 2)工作原理 1)客户端一台客户机与服务器建立连接后,会发 ...

  5. Linux下tomcat服务

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  6. Linux下Tomcat catalina.out自动归档,以及logrotate 配置详解

    Linux下Tomcat catalina.out自动归档 如果 catalina.out 日志达到 2GB 大小的时候,Tomcat 因为缓存问题,便没有办法继续输出日志了.  为了避免这种情况,你 ...

  7. linux下tomcat服务的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

  8. Linux下DNS服务器搭建详解

    Linux下DNS服务器搭建详解 DNS  即Domain Name System(域名系统)的缩写,它是一种将ip地址转换成对应的主机名或将主机名转换成与之相对应ip地址的一种机制.其中通过域名解析 ...

  9. PuTTy linux下tomcat服务的相关命令

    一:Linux下tomcat服务的启动.关闭与错误跟踪,使用PuTTy远程连接到服务器以后,通常通过以下几种方式启动关闭tomcat服务:切换到tomcat主目录下的bin目录(cd usr/loca ...

随机推荐

  1. 【HTML】前端性能优化之CDN和WPO的比较

    CDN通过将资源存储在更接近用户的位置,缩短到服务器的往返行程,加快页面加载时间来解决性能问题.WPO解决方案,如Radware的FastView,则在前端进行性能提升处理,使页面更有效地呈现在浏览器 ...

  2. cygwin ctrl+s的问题

    使用cygwin的时候,因为习惯了ctrl+s保存文档,使用vim时也顺手按下去了,然后cygwin就冻结了. 这个时候可以按下 ctrl+q 来重新激活 cygwin

  3. openkm预览功能报错:flexpaper License key not accepted(no key passed to viewer)

    openkm:6.3.4 使用google浏览器打开,想预览文件,但是pdf.word和图片都不能显示.只是显示空白. 换成IE后,再次尝试,发现了报错信息: 解决方案: 1- Stop openkm ...

  4. JavaSE入门学习20:Java面向对象之接口(interface)(一)

    一Java接口 接口(英文:interface)是抽象方法和常量值的集合,在Java编程语言中是一个抽象类型,接口通常以interface来声 明.类是一种详细实现体.而接口定义了某一批类所须要遵守的 ...

  5. webdriver实用指南python版本(1)-安装开发环境

    webdriver实用指南是本人编写的系列丛书,包括ruby版.python版和java版.在线版是免费的,之前是放在我的github上,但是很多同学总不记得地址,现在转到我的博客上,方便大家阅读. ...

  6. samba 服务器搭建

    为了能在两台机器上共享代码,方便测试不同平台性能和搭建分布式的web server,今天耗费半天时间搭建一个samba服务器共享数据,要求开放写权限,但多次实验均告失败,最终在 鸟哥 的提醒下 检查发 ...

  7. 目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练

    将目标检测 的标注数据 .xml 转为 tfrecord 的格式用于 TensorFlow 训练. import xml.etree.ElementTree as ET import numpy as ...

  8. application配置和profile隔离配置(转)

    前言 github: https://github.com/vergilyn/SpringBootDemo 说明:我代码的结构是用profile来区分/激活要加载的配置,从而在一个project中写各 ...

  9. haproxy 关闭ssl3

    在使用的过程中,我们发现在用IE浏览器的时候 我们设置成 然后我们的网站会出现部分页面不出来 然后我们也发现在扫面网站链接的时候 所以当务之急是关闭ssl3 我这里的反向代理使用的是haproxy 版 ...

  10. javaweb下载文件

    //读取文件->写出文件 public static void main(String[] args) { InputStream in =null; OutputStream out = nu ...