网页访问变慢的原因分析及优化

我的个人wordpress博客开通也有二个星期了,除了写了几篇文章之外,对云服务器、       wordpress的使用也是非常的感兴趣,从一开始的配置,到各种插件的探索,玩的不亦乐乎。自我感觉个人博客的有意思之处也是在此:建设的乐趣。就像小时候非常爱搭的“房子”一样。哈哈:)

这几天访问网站时,明显感觉网页的加载速度变慢了。刚刚开通博客时,网页可以“秒开”,现在居然要两三秒了。因为不知道从哪里看到网站的访问速度也影响搜索引擎的排名,我决定分析一下网页变慢的原因。可能的原因无非以下两点:

  1. 服务商网络不稳定,网速下降;
  2. 网站程序因为各种原因响应速度降低,如需要加载外部链接,插件过多,数据库访问速度等等;

首先是第一点,因为购买的是非常入门款的云服务器,机房也不是最高等次的,网速出现时好时坏还是有可能的。为了排除是网站的影响,我决定在 nginx的根目录下 创建了一个名为info.php的文件,内容如下:

<?php phpinfo(); ?>

在浏览器中访问网页,非常顺滑。看样子服务提供商还是非常靠谱的,“诚不我欺也”。那么问题就在于网站本身了。

可能的原因,我感觉可能是因为最近安装了一些插件,是否可能内部链接了其他的服务,导致网页加载速度变慢?于是卸载了最近尝试的几个插件,发现网页加载的速度没有明显的变化,衰。

那么,是不是因为动态网页的缘故,加载网页时服务器的cpu负载太高? 在加载网页时,通过glances 监控,cpu的利用率也只有11%左右,像下面这样:

所以说,说cpu占用过高也是站不住脚的。不过,观察到一个现象,每当网页加载时,mysqld 都会产生 15-17k/s的 IOW 。有没有可能是mysql没有优化导致卡在这块了呢,而且,mysql 到底在写啥?带着这个疑问我决定查看mysql的执行记录。

首先登录mysql :

mysql -uroot -p

查看 变量信息

show variables

可以看到其中“general_log” 变量的值为OFF,log 的地址如下。

执行语句:

mysql> SET GLOBAL GENERAL_LOG = ON;
Query OK, 0 rows affected (0.00 sec)

然后加载网页,查看在/var/run/mysqld/mysqld.log生成的日志。

发现日志中,基本是SELECT 语句,居然没有写库操作,那么mysqld 的写入操作(当然也有可能是写入日志或者其他)是什么情况,有知道的同学麻烦赐教。而且,mysql的cpu及内存占用均比较小,看样子,mysql的访问也不是问题所在。

那么,只能从系统性能方面着手了。非常有可能网页访问速度下降是因为系统性能下降导致的。特别让我注意的是,glances 标红了我的内存占用,居然有90%多。在glances 中按 “m”键,可以按内存占用排序进程,发现占用内存最多的进程都是一个叫做“php-fpm”的进程,而且有19个。难怪内存占用如此之高。为啥存在如此之多的php-fpm进程呢,”I did some digging”,大概原因是这样的:

因为nginx将动态网页交给php解析,因此php与nginx通过socket通信,这些php-fpm进程大部分是解析php网页的。但是为了提高性能,不可能为每一个请求单独开启一个进程处理完毕后关闭。因此php-fpm会保留一些“idle”进程用于等待请求。当然,对于访问量大的网站来说,更多的”stand-by”进程肯定能保证访问速度了,前提也是你有大量的内存可供使用了。对于我这样的虚拟机来说,肯定是撑不起这么多的进程的。

php-fpm进程的个数可以通过配置调整,打开 /etc/php-fpm.conf ,可以看到php有两种方式,一种是静态(static),一种是动态(dynamic),静态配置下,系统会默认启动一定数量的进程,数目与pm.max_children一样。如果是动态配置,进程数受四个参数影响。

  1. pm.start_servers;
  2. pm.min_spare_servers
  3. pm.max_spare_servers
  4. pm.max_children

第一个参数是系统启动时的进程个数,第二个是最小的idle进程个数,当空闲进程低于这个数字的时候,系统会自动启动到最小进程个数。我的配置文件默认参数为20。显然我的机器的当前进程数主要受这个影响。第三个是最大空闲进程数,当空闲进程超过这个时,系统会自动清理。第四个是最大的进程数。

按照一个进程大概50M内存占用的估计,以及我超低访问量,以及超迷你的内存,我修改参数如下:

 

pm.start_servers=5
pm.min_spare_servers=5
pm.max_spare_servers=10
pm.max_children=20

保存,重启php服务

service php-fpm restart

重新访问网页, 网页访问又重新变得顺滑了。开心,哈哈。


As you can see , I am a rookie.

3 thoughts on “网页访问变慢的原因分析及优化

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注