服务器优化的五大“军规”

标签: 网站和架构 | 发表时间:2011-10-30 05:24 | 作者:macaque1101 MessyCS
出处:http://hi.baidu.com/injava

下面这五条规则可以帮助你优化安装的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分配尽量多的内存。

第五条规则:Apache =处理器

在Drupal网站上,Apache的大多数时间用于执行PHP代码。实际上,要看服务器有没有得到优化,一个直观的指标就是当Apache使用100%的可用处理器资源时;系统的其他所有瓶颈都消除后,通常才会出现这一幕。

那是由于,如果你允许Apache响应太多的并发请求,它就会将可用的处理器资源分配给每一个请求,因而每秒请求的速度就不会增加!

结论
我们在本文中仅仅探讨了服务器优化的一些方面,而且作了几个假设;不过我希望,上面这五条规则讲得很清楚;希望它们会帮助你在部署时作出更明智的决定。

阅读全文
类别:网站和架构 查看评论

相关 [服务器 优化] 推荐:

梦幻西游服务器的优化

- 阿贡 - 云风的 BLOG
在历史工程上修补是件麻烦的事情. 前两天说起梦幻西游服务器的优化. 这几天我到广州住下来,打算专门花一周时间搞定这件事. 由于以前都是网上聊天,只有坐到一起才能真正理解问题. 目前,梦幻西游,只使用单台机器,最高配置 8 个 CPU ,配置 8G 内存. 就算最热闹的服务器,也用不完这些资源(大约只用满了 3 个 CPU ,一半的内存).

服务器优化的五大“军规”

- MessyCS - inJava
下面这五条规则可以帮助你优化安装的Drupal服务器,另外附有一些示例,说明如何运用这些规则. 服务器优化是个庞大的领域,它在不断进化,但是我们可以通过研究分析一些简单的情况,了解比较复杂的情况. 下面我们侧重于几个变量,衡量它们对性能带来的影响. 第一条规则:要是不测试性能,优化就无从谈起. 现在有好多工具可以用来准确地评估和测试性能,不过本文就着重介绍最重要的一款工具:Apache Benchmark.

Tomcat 生产服务器性能优化

- - ITeye博客
增加JVM堆(heap). 线程池(thread pool)的设置. Tomcat原生库(native library). 第一步  – 提高JVM栈内存Increase JVM heap memory. 要更改文件(catalina.sh) 位于"\tomcat server folder\bin\catalina.sh",下面,给出这个文件的配置信息,.

centos7作为web服务器优化

- - 操作系统 - ITeye博客
centos7作为web服务器优化. 1、关闭firewalld:. systemctl stop firewalld.service #停止firewall. systemctl disable firewalld.service #禁止firewall开机启动. 2、安装iptables防火墙.

梦幻西游服务器 IO 的一点优化

- zz - 云风的 BLOG
关注梦幻西游服务器的性能问题,是源于前几天跟同事的聊天. 谈到能否把梦幻西游服务器做成无盘站,或是放进虚拟机里,便于日常维护管理. 意外的了解到,现在磁盘 IO 性能居然成了梦幻西游服务器的瓶颈. 据我所知,梦幻西游的服务器数据储存是这样做的:. 主游戏进程不负责储存,一切都在内存中. 所有玩家的数据就是内存数据结构.

笔记: Xen VM 里面的 MySQL 服务器优化

- - #raynix's notes
我一直都对公司 Xen VM 的数据库服务器不满, 因为实在是太慢了. 但是几百个 GB 的商业数据我可不敢动, 于是先在测试服务器上证实一下我的想法. 硬盘就是普通的 SATA 7200RPM, VM 用的是 LVM 分区. 然后我用之前写的一个小程序做批量更新, 32K 记录. 缺省配置下, 运行时长达到24分钟, 而优化后则只需要27秒.

Erlang服务器内存吃紧的优化解决方法

- - CSDN博客系统运维推荐文章
问题提出:服务器100万人在线,16G内存快被吃光. 查看进程数目是否正常,是否超过了erlang虚拟机的最大进程数. 查看节点的内存瓶颈所在地方. 显示内存大部分消耗在进程上,由此确定是进程占用了大量内存. (以输出text方式启动etop,其间隔为1秒,输出行数为20行,按照内存排序. 这里spawn一个新进程,目的是输出etop数据时不影响erlang shell 输入.).

根据status信息对MySQL服务器进行优化

- - 开心平淡对待每一天。热爱生活
网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化.   可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:.

优化WordPress速度 为服务器和访客减压

- - 神刀网
如果你用wordpress来做CMS站点那么你如果用主机托管那么一定杯具了,用VPS内存小了宽带小了也麻烦. 其他人都是教了一招,这次我汇集百家所长,十招齐发,十管齐下,勇者无敌. 大家多说时间就是生命,可能几秒钟的等待就会让网站失去一个访客,对于网站的速度你不能等. 1.Cookie的静态化制作 约有80%至90%的时间,访客要花费大量的时间等你的WordPress加载静态内容.

Weblogic服务器的性能调试优化方案

- - Java - 编程语言 - ITeye博客
注:在下面做的介绍都是以Weblogic8.1为例的,其它版本的Weblogic可能会有些许不同. 1) 设置JAVA参数;. a) 编辑Weblogic Server启动脚本文件;. b) 编辑set JAVA_OPTIONS命令,如:set JAVA_OPTIONS="-Xms256m —Xmx256m;.