服务器优化的五大“军规”
下面这五条规则可以帮助你优化安装的Drupal服务器,另外附有一些示例,说明如何运用这些规则。服务器优化是个庞大的领域,它在不断进化,但是我们可以通过研究分析一些简单的情况,了解比较复杂的情况。
下面我们侧重于几个变量,衡量它们对性能带来的影响。
第一条规则:要是不测试性能,优化就无从谈起。
现在有好多工具可以用来准确地评估和测试性能,不过本文就着重介绍最重要的一款工具:Apache Benchmark。使用该工具在你的网站上查询特定页面(甚至可以向它传送cooki信息,模拟通过验证的用户),以测量响应情况。你可以在接受测试的服务器上的命令行使用Apache Benchmark,同时仍能获得有效的结果,因为该工具占用的处理器和内存资源很少。下面是一种典型的用法:
$ ab -n 1000 -c 20 http://example.com/
这里的值如下:
n = 页面请求的数量
c = 并发连接的数量
最重要的参数是c,即并发请求的数量,而n这个数要足够大,才能提供稳定的结果。关键在于,要使用不同的c值来测试网站,先从小的数值开始,逐步加大,直到“每秒请求”的返回值开始下降。比如说:
$ ab -n 1000 -c 20 http://example.com/ | grep ‘Requests per second’
每秒请求:45.29 [#/sec](平均值)
$ ab -n 1000 -c 40 http://example.com/ | grep ‘Requests per second’
每秒请求:46.91 [#/sec](平均值)
$ ab -n 1000 -c 60 http://example.com/ | grep ‘Requests per second’
每秒请求:8.55 [#/sec](平均值)
$ ab -n 1000 -c 80 http://example.com/ | grep ‘Requests per second’
每秒请求:2.21 [#/sec](平均值)
我们可以使用更小的增量来细化c值,但是以10为最接近倍数通常足矣。
第二条规则:减少占用的内存,直到分页停止。每秒请求数突然下降最有可能的原因是,我们让内存过载,系统开始交换至分页文件。这给总体性能带来的影响与在Windows、Mac OS X或支持分页机制的任何系统上打开过多应用程序带来的影响一样。
在你测试性能后,看一下使用了多少个交换文件。下面是4GB服务器上的典型值:
$ free -m
total used free shared buffers cached
Mem: 4011 1481 2530 0 45 824
-/+ buffers/cache: 611 3400
Swap: 8191 2145 8191
这里我们使用2145 MB大小的交换文件;在使用最大的c值测试性能时,可能已创建了该文件。你首先要做的就是清空交换文件,然而查一下值是否回到零:
$ sudo swapoff -a
$ sudo swapon -a
$ free -m
total used free shared buffers cached
Mem: 4011 1379 2632 0 45 834
-/+ buffers/cache: 499 3512
Swap: 8191 0 8191
现在关键是,使用接近我们看到性能下降的那个值的c值,重新做一遍上面的测试,检查每次请求后的分页文件:
$ ab -n 1000 -c 30 http://example.com/ | grep ‘Requests per second’
每秒请求:45.93 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 0 8191
$ ab -n 1000 -c 40 http://example.com/ | grep ‘Requests per second’
每秒请求:40.31 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 312 8191
$ ab -n 1000 -c 50 http://example.com/ | grep ‘Requests per second’
每秒请求:12.27 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 1902 8191
你可以从上面的结果中看到,当服务器在约40个并发请求的情况下开始分页时,请求速度大幅下降。
第三条规则:对连接而言,多就是少。默认情况下,Apache和MySQL配置成接受150条连接。应用PHP的大多数系统(如Drupal)每个线程只会打开一条连接,所以你可以在连接两头,安全地将连接数量设成同一个值。说明一点,MySQL实际上允许n+1条连接,所以你有一条额外的连接用于管理。
遗憾的是,有些服务器管理员试图“优化”服务器时,会将连接数量提高到500条、10000条或者甚至更多。要是服务器在负载状态下运行,这会带来严重影响。
Drupal网站通常每个请求需要超过32 MB的内存,你只要查看命令top返回的结果,就可以留意平均值:
$ top
top - 20:28:52 up 12:11, 2 users, load average: 1.34, 0.55, 0.35
Tasks: 93 total, 10 running, 83 sleeping, 0 stopped, 0 zombie
Cpu(s): 50.2%us, 21.4%sy, 0.0%ni, 28.0%id, 0.0%wa, 0.0%hi, 0.1%si, 0.3%st
Mem: 4108192k total, 1787064k used, 2321128k free, 46520k buffers
Swap: 8388604k total, 0k used, 8388604k free, 861772k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32080 www-data 20 0 419m 64m 27m S 26 1.6 0:01.19 apache2
32110 www-data 20 0 419m 65m 28m S 25 1.6 0:01.69 apache2
32025 www-data 20 0 419m 63m 27m S 24 1.6 0:01.89 apache2
32065 www-data 20 0 417m 62m 27m S 22 1.6 0:01.13 apache2
32178 www-data 20 0 408m 53m 27m R 22 1.3 0:00.66 apache2
32024 www-data 20 0 418m 64m 28m R 21 1.6 0:02.85 apache2
32176 www-data 20 0 417m 62m 27m S 21 1.6 0:00.99 apache2
32032 www-data 20 0 408m 53m 27m S 21 1.3 0:02.45 apache2
32104 www-data 20 0 417m 62m 28m S 21 1.6 0:02.55 apache2
32116 www-data 20 0 415m 59m 27m R 21 1.5 0:01.79 apache2
32119 www-data 20 0 417m 62m 27m S 21 1.6 0:01.04 apache2
32164 www-data 20 0 417m 62m 27m R 21 1.6 0:00.99 apache2
32179 www-data 20 0 408m 53m 27m R 21 1.3 0:00.63 apache2
32222 www-data 20 0 403m 48m 27m S 17 1.2 0:00.50 apache2
23906 mysql 20 0 675m 115m 6628 S 14 2.9 2:33.85 mysqld
32147 www-data 20 0 419m 64m 27m R 14 1.6 0:02.26 apache2
32226 www-data 20 0 416m 56m 23m R 9 1.4 0:00.26 apache2
关键在于,估计Apache使用了多少内存,为此只要求进程所用的RES(常驻非交换物理内存)值的平均值。这里RES的平均值为约62MB。
你还要查看服务器在空载状态下(这时没有apache2进程在运行)的闲置内存量:
$ top
top - 20:40:45 up 12:23, 1 user, load average: 0.29, 0.38, 0.45
Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4108192k total, 1388132k used, 2720060k free, 46680k buffers
Swap: 8388604k total, 0k used, 8388604k free, 866208k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
32061 jfparadi 20 0 19272 1244 932 R 0 0.0 0:01.52 top
1 root 20 0 23628 1780 1244 S 0 0.0 0:00.64 init
2 root 20 0 0 0 0 S 0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:02.56 ksoftirqd/0
4 root RT 0 0 0 0 S 0 0.0 0:00.02 migration/0
5 root RT 0 0 0 0 S 0 0.0 0:00.03 migration/1
6 root 20 0 0 0 0 S 0 0.0 0:01.19 ksoftirqd/1
7 root RT 0 0 0 0 S 0 0.0 0:00.03 migration/2
8 root 20 0 0 0 0 S 0 0.0 0:00.90 ksoftirqd/2
9 root RT 0 0 0 0 S 0 0.0 0:00.02 migration/3
10 root 20 0 0 0 0 S 0 0.0 0:00.74 ksoftirqd/3
11 root 20 0 0 0 0 S 0 0.0 0:01.94 events/0
12 root 20 0 0 0 0 S 0 0.0 0:01.91 events/1
13 root 20 0 0 0 0 S 0 0.0 0:01.79 events/2
14 root 20 0 0 0 0 S 0 0.0 0:03.11 events/3
15 root 20 0 0 0 0 S 0 0.0 0:00.00 cpuset
16 root 20 0 0 0 0 S 0 0.0 0:00.00 khelper
19 root 20 0 0 0 0 S 0 0.0 0:00.04 netns
20 root 20 0 0 0 0 S 0 0.0 0:00.00 async/mgr
23 root 20 0 0 0 0 S 0 0.0 0:00.00 xenwatch
24 root 20 0 0 0 0 S 0 0.0 0:00.00 xenbus
56 root 20 0 0 0 0 S 0 0.0 0:00.11 sync_supers
这里,闲置内存量是2720060KB,即2656MB。
现在,你需要使用这个简单等式,确认上面发现的c值:
c = FREE / RES
c = 2656MB / 62MB
c = 43(接近上面发现的40)
这个值是服务器开始崩溃的阈值,我们要阻止Apache遇到这个极限值。我们可以将客户端数量从150个减少到40个,看看对性能有什么影响。
如果是Apache,在你使用的特定MPM实现所对应的部分下面编辑配置文件,并调整这个值:
MaxClients 150
如果是MySQL,设置或调整这个值:
max_connections = 150
一旦你根据上面发现的数值(我们在这里使用40)调整了这些值,重新测试一下性能:
$ ab -n 1000 -c 20 http://example.com/ | grep ‘Requests per second’
每秒请求:44.43 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 0 8191
$ ab -n 1000 -c 40 http://example.com/ | grep ‘Requests per second’
每秒请求:45.11 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 0 8191
$ ab -n 1000 -c 60 http://example.com/ | grep ‘Requests per second’
每秒请求:43.27 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 0 8191
$ ab -n 1000 -c 80 http://example.com/ | grep ‘Requests per second’
每秒请求:44.59 [#/sec](平均值)
$ free -m | grep Swap
Swap: 8191 0 8191
如你所见,分页已被消除。但是为什么我们能够响应超过40个的并发请求呢?完全是因为Apache将额外的请求放入队列中,同时处理仅仅40个请求。客户端响应仍会出现延迟,但是如果不让内存过载,每秒响应的请求更多。此外,每秒请求数值保持稳定,因为处理速度取决于处理器。实际上,这两个数都以等值单位:请求/秒和周期/秒来表示。
第四条规则:MySQL =内存很显然,上述结果假设数据库已经过合理配置;假设我们没有慢速查询。实际上,对Drupal网站来说,MySQL通常并不耗用大量的处理器资源。在精心配置的服务器上,MySQL耗用的处理器资源只有10%到25%。
除了搜索活动外,查询的冗余性很强;如果MySQL的缓存和线程能得到优化,MySQL就能从中得益。看到MySQL被配置成使用近50%的可用内存,这并不罕见。
很显然,这个数依赖实际应用,原则就是为MySQL分配尽量多的内存。
在Drupal网站上,Apache的大多数时间用于执行PHP代码。实际上,要看服务器有没有得到优化,一个直观的指标就是当Apache使用100%的可用处理器资源时;系统的其他所有瓶颈都消除后,通常才会出现这一幕。
那是由于,如果你允许Apache响应太多的并发请求,它就会将可用的处理器资源分配给每一个请求,因而每秒请求的速度就不会增加!
结论
我们在本文中仅仅探讨了服务器优化的一些方面,而且作了几个假设;不过我希望,上面这五条规则讲得很清楚;希望它们会帮助你在部署时作出更明智的决定。
类别:网站和架构 查看评论