前段时间服务器出现了一个奇怪的现象,一台配置不错的服务器,HP DL385 G7 (64G内存,2颗十二核CPU,连着一台存储)系统负载不规律的每过一段时间就非常高,高的时候维持在四五十,而这个时候呢,通过各种命令(top、vmstat、iostat、ifstat、sar)查看,各项资源都比较闲,一时间摸不着头脑。
系统资源没问题,只能从服务着手了,这台服务器主要跑nis和nfs服务,nis服务只是提供网络用户,因为这个服务导致负载升高的可能性不高,首先就想到nfs了。
首先介绍下服务器的环境,这台服务器通过nfs将存储上的数据共享给客户端服务器,开发人员在客户端服务器上工作,开发团队大概有100人。由于开发人员多,项目也多,完全有可能因为nfs服务的性能瓶颈影响系统性能。
记得曾经跟红帽售后提过一个问题,大概是:我nfs服务器要接受好几台客户端服务器的挂载,而且研发人员也多,负载高的话,nfs服务会不会受不了。当时售后给我的答复是“没关系,只要把nfs进程数调大来就可以了”,如此淡定的回答让我信服了。不过这个时候我nfs服务器进程已经调到80个进程了,难道还不够?于是把进程数改到160个,重启nfs服务,观察了一段时间,服务器负载降下来了,到现在再也没出现类似负载高的情况。
其实像这样规模的开发环境就不应该用一台服务器安装linux系统搭建nfs服务来共享文件,这样性能也不怎么好,而应该直接用一台中高端的存储设备,用存储自带的nfs共享功能,这样性能比系统搭建出来的nfs性能要好,这也是当初环境搭建方案的一个败笔。
调整nfs进程方法:
[root@server2 ~]# vim /etc/init.d/nfs # Number of servers to be started by default [ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=8默认是8个进程,一般在生产服务器上,在系统资源够的情况下,可以按照一颗CPU 8个nfs进程来算,我24颗CPU 160个进程也比较合理。如果有某个系统资源成瓶颈的时候,就要适当减少nfs进程数,否则也有可能因为nfs进程过多导致负载升高。
在网上有看到过一些帖子,有人问服务器CPU、内存、网络、IO都很闲,为什么负载居高不下呢,有个人回复到:“楼主服务器是不是跑的nfs服务?”,但是这个人没有回复怎么解决,也许他也遇到了类似的问题也没解决。我想说的是在查找性能瓶颈的时候,不能只盯着硬件资源看,有些服务本身也是存在瓶颈的,就像本文的问题,我觉得还是有不少人遇到的。
本来想模拟问题和解决过程的,但是手头没有测试机,虚拟机测试不出来,看这个测试篇吧 。