低内存服务器LAMP的内存优化
购买了阿里云服务器,苦于内存太小,Mysql进程总是无端的自动结束,便着手于服务器的内存优化了。你完全可以按照我如下的操作来进行一步步的优化,最终让你的网站日访问量在1W PV时,也能稳定的运行。
我使用的服务器操作系统是Ubuntu 12.04 64位 LTS,内存为512M并且没有启用虚拟内存。优化后,服务器内存一般占用在256M-378M之间,并稳定运行。所以呢,我应该来分享一下我的配置过程。
确定空闲的内存和虚拟内存是否开启
要着手配置服务器之前,先来看一下服务器内存的使用情况。你可以通过如下命令来进行查看:
free -m
当然,你也可以通过如下命令来查看内存都用到哪了(根据各进程内存占用大小排序的一个列表)!
ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r | less
关闭不用的服务,让LAMP处于低内存占用状态
在关闭不用的服务之前,我们需要知道哪些服务项是不必要的。我找到了一款开机启动服务管理的软件:sysv-rc-conf
,图开操作界面,很实用。其安装命令如下:
接着通过如下命令来打开sysv-rc-conf的图形操作界面(如何操作在图片界面中有说的),如下
sudo sysv-rc-conf
其图形界面如下:
下图中所示的服务是我关闭的,你可以退据实际情况定夺:
-
sendmail
:这是一个邮件服务,因为我使用的是163邮箱stmp服务,所以就没有必要开启。如果你需要你的服务器,能通过php mail()函数发送邮件,那就不要关闭了。 -
dns-clean
:使用拨号上网时,清除DNS信息。这在服务器上一般用不到。故直接关闭其启动。
关于更多的linux服务介绍,你可以移步到:ubuntu 服务优化
配置APACHE
在内存占用中,apache是最大的内存占用户。安装LAMP环境后,默认的相关配置是很不适合于小内存服务运行的,所以很有必要做一定的修改。我将用如下的技术点来让apache占用更低的内存,保持原有的速度。
- 处理少量的并发请求
- 加载必要的模块
- 记录必要的日志信息
减少APACHE子进程的数量
prefork模式是由多路处理模块(MPM)实现了一个非线程型的、预派生的web服务器。它具有很强的自我调节能力,只要很少的配置就可以了。最重要是将MaxClients设置为一个适合的值以处理潜在的访问高峰其,但其值不能太大,以致超出了物理内存的大小。如下是我的配置内容:
<IfModule mpm_prefork_module>StartServers 1
MinSpareServers 1
MaxSpareServers 3
MaxClients 15
MaxRequestsPerChild 3000
</IfModule>
当Apache被启动时,Apache会自动创建StartServers个进程,并且尽力将空闲进程数保持在MinSpareServers和MaxSpareServers之间。当空闲进程小于MinsPareServers时,Apache会以大约1s钟的时间来创建进程;当小于MaxSpareServers时,Apache将会删除多余的空闲进程,释放服务器资源。进程数的最大值是由MaxClients决定。MaxRequestsPerChild用来控制每个进程在处理了多少次请求之后自动销毁,若这个参数的值为0表示无限(即不销毁进程)。
worker模式是由多路处理模块(MPM)使网络服务器支持混合的多线程多进程。由于采用的是线程处理,所以可以处理大量的请求的同时,系统资源的占用小于基于进程的MPM。我的控制指领配置如下:
<IfModule mpm_worker_module>StartServers 1
MinSpareThreads 5
MaxSpareThreads 15
ThreadLimit 25
ThreadsPerChild 5
MaxClients 25
MaxRequestsPerChild 200
</IfModule>
StartServers指令设置了服务器启动时建立的子进程数量。MinSpareThreads最小空闲进程数。MaxSpareThreads配置最大空闲线程数。ThreadLimit每个子进程可配置的线程数上限。MaxClients允许同时伺服的最大接入请求数量(最大线程数量)。ThreadsPerChild每个子进程建立的常驻的执行线程数。MaxRequestsPerChild配置每个子进程在其生存期内允许伺服的最大请求数量。
除了更改以上配置外,我还更改了“KeepAliveTimeOut
(连接存活时间)”,将其值调整为15,默认值为5。