修改 IIS 应用程序池设置需谨慎!

最近公司的项目要上一个论坛,于是选用了Discuz 7 的,新版的做得很不错,用户体验也很棒。但由于这东西是为各类使用者开发的,所以在于性能方面需要做一定的优化。

ASP.NET 做优化目前我还是比较熟悉了,但 php 方面还得慢慢学。

我的目标是一台服务器扛 1000 Request/s

因为目前项目发展还在初期,所以服务器只用的一台,所以只能让Discuz 7 在 IIS 上面跑。

目前服务器配置情况:

  • CPU:至强 4 核 双 CPU 2.33G
  • 内存:8G
  • OS: Windows Server 2003
  • Web 服务:IIS6.0 + FastCGI
  • PHP 版本:5.2.8 no thread safe
  • 数据库:SQL Server 2005 + MySQL 5.1

目前我的 ASP.NET 的页面用 Memcached 做过页面缓存以后,用 ApacheBench 测试可以跑到 1500 Request/s 左右,这个值还是比较满意了。但 PHP 在 IIS 上面跑我就不知道会怎么样了,经过反复的改配置,再测试,依然还是只能跑到 300 Request/s 不到,而且会有很多失败的(有时候接近50%)。

今天再次做配置的时候发现,原来出现请求失败的原因在于 IIS 应程序池的配置不当。因为当然都做反复的测试,所以一直没有在意到问题会出在这里。

出错的配置:

  • 回收工作请求:35000
  • 请求列队限制:4000
  • Web 园:4

于是改回去:

  • 回收工作请求:关
  • 请求列队限制:1000
  • Web 园:1

再次用 AB 测试:ab -n 10000 -c 1000 http://forum.test.com/phpinfo.php

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Server Software:        Microsoft-IIS/6.0
Server Hostname:        forum.ytrip.com.tw
Server Port:            80

Document Path:          /test.php
Document Length:        41767 bytes

Concurrency Level:      1000
Time taken for tests:   5.625 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      419420000 bytes
HTML transferred:       417670000 bytes
Requests per second:    1777.78 [#/sec] (mean)
Time per request:       562.500 [ms] (mean)
Time per request:       0.563 [ms] (mean, across all concurrent requests)
Transfer rate:          72815.97 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.8      0      16
Processing:   156  542  80.4    547     766
Waiting:       63  157  58.6    141     453
Total:        156  542  80.4    547     766

Percentage of the requests served within a certain time (ms)
  50%    547
  66%    563
  75%    563
  80%    578
  90%    578
  95%    641
  98%    703
  99%    750
 100%    766 (longest request)

当然,这个程序只是简单的,所以可以跑到 1777 Reuqest/s,但主最要的是没有出现请求失败的了,一个都没有!于是再次测试 Discuz 的一个列表页面,结果只能跑到 230 Request/s,但一样没有错误出现。

总结来说,在服务器做性能优化是配置这些数字还是要慢慢测试才能找到适合自已服务器的,重要的一点是一定要改一点测试一下,千万别同时改好多再测试!

Discuz 的优化还得花点时间慢慢弄,不知道为什么,它的缓存方法原理跟我在 Asp.NET 上面的做方法相似,只是我用 Memcached 来存,它是存文件的,但速度不会差这么多的,应该再研究研究,就会上去了。