http://cookingbsd.blog.51cto.com/5404439/952375
最近帮朋友升级了论坛,把数据库换成了postgreSQL,运行有一周。通过前后对比才发现pgsql性能有多强悍,或者说mysql有多低能。
论坛地址: www.ifxtx.com
网络带宽:100M独享
论坛流量:日均IP 8K,日均PV 35K
论坛程序:dz7.2
论坛数据:用户15万,主题32万,回帖502万,数据库3G左右。
系统配置:
web server 为 DELL 2950III 4核*双CPU E5320 1.86GHz,8G内存,SAS组RAID5,Centos6.2 X64,nginx,php-fpm,xcache
db server 为 DELL 2950III 4核*双CPU E5320 1.86GHz,8G内存, SSD盘 * 3 做RAID5,Centos6.2 X64,postgresql 9.1,mysql5.1
webold server 为 DELL R710 , 8G内存, SAS组的RAID5,Win2003,Mysq 5.1,IIS
之 前论坛是 webold 上面跑也跑数据库,论坛相当慢,首页打开时常需要12秒多。IIS经常挂掉需要定期重启。后来启用了db服务器,并且加大了dz数据调用频率,系统负载有 所下降。首页打开非缓存时在7秒左右。不过IIS还是时常抽风。询问得知mysql连接数要开到1000以上才能保证论坛不出现“数据库无法连接”的白 板。不过我发现实际开的是7000!
因为数据库实在不给力,遂决定使用高效的pgsql做替换尝试。
于 是使用web + db的组合方式。web上php-fpm开了150个最大进程,前端是nginx开了4个进程;db上只跑pgsql,开了500个最大连接。一番折腾测 试结果还不错,于是在上周六做了系统切换。经过这段时间性能监控,对于pgsql的表现非常满意。说非常而不是极其满意这是因为之前对pgsql有一定了 解,所以对其相比mysql的优异性能表现没太多意外。但对于从未接触过mysql之外的人来说也许会震惊的!
论坛在线简要对比,在线人数约2K(session有效时间30分钟):
项目 | webold + db(mysql) | web + db(pgsql) |
index非缓存刷新 | 大约7秒(非缓存清空) | 2秒左右(清空所有缓存包括模板) |
index缓存刷新 | 大约1秒 | 30-50ms |
forumdisplay主题列表 | 100-200ms | 30-120ms (与版块主题数量有关) |
post帖子内容页 | 100-200ms | 30-50ms左右(不分缓存与否) |
除了在版块主题列表上差距不大之外,其他项目差别非常明显。并且pgsql各项数据与在调试阶段无流量压力时的值没啥差别!
为啥调试阶段的数据库性能表现与上线后没啥差别呢? 除了pgsql程序本质优秀之外还有个重要因素:pgsql是行锁,而dz默认采用的mysql是myisam表锁。流量越大表锁对性能的影响越恶劣。具体解释请看这儿http://www.discuz.net/thread-2934412-1-1.html
下面是21点论坛高峰期服务器状况截图:
这些是webserver的
![](https://i-blog.csdnimg.cn/blog_migrate/5e1e235746cf35d762f3b665400313d6.jpeg)
![](http://static.oschina.net/uploads/img/201207/23173543_0Ipx.jpg)
![](http://static.oschina.net/uploads/img/201207/23173544_ba1p.jpg)
![](http://static.oschina.net/uploads/img/201207/23173545_QAAj.jpg)
这些是dbserver的状况:
![](https://i-blog.csdnimg.cn/blog_migrate/1ce6b0a5c9e78cd2530f56938135dd25.jpeg)
![](http://static.oschina.net/uploads/img/201207/23173546_DMby.jpg)
![](https://i-blog.csdnimg.cn/blog_migrate/b6cc59785dc817d9c77aefb620280b1b.jpeg)
这是nginx的状况以及webserver连接数:
![](http://static.oschina.net/uploads/img/201207/23173546_BlsQ.jpg)
![](http://static.oschina.net/uploads/img/201207/23173546_hfWD.jpg)
如果以上数据只是让你觉得流量不小,服务器性能比较好,所以服务器压力不大。那么就再看一张图:
![](http://static.oschina.net/uploads/img/201207/23173547_3X6x.jpg)
上 图是跑在webserver上面的pgsql连接池程序pgbouncer ,设定的非性能最佳的trasaction模式而是session模式。但实时连接数如此之低,没超过10个,是不是让你震撼了呢?你再回头看看上面 db-top.png 这张图中postgres进程数量作相互对证,就知道pgsql有多强悍了吧。
以 前mysql要开1000个连接,这并不代表mysql可以处理1000个这么多个连接请求,而反倒是因为它太慢处理不了不能及时处理完论坛而只能增加最 大连接数让被阻塞的连接请求处于队列中,从而用户在打开页面时不会出现mysql数据库无法连接的错误页面,而是一直等待罢了。
而pgsql因为 处理效率高性能出色,所以可以尽快处理完web请求从而接受新的请求,于是总的连接数反倒是减小了。小得连我吃惊的地步。上线后做过(短时间)极端测试, 把pgbouncer允许连接数和pgsql最大连接数改到30个,论坛也运作正常。可见截图数据可信。
总而言之,如果你是新论坛,数据量不超过100万,那么用mysql没啥性能问题(表损坏除外)。但如果论坛已经上线运行已久,数据量过百万上千万,那么除非用硬件去堆否则mysql的低能表现会让你头疼甚至崩溃。
所以用DX2,2.5慢如蜗牛的站长们不要吐嘈dz。dz只是功能太多而已,根本原因在于mysql太垃圾,无法应付dz的复杂查询以及高流量而已。
附注:以上数据那么漂亮,除了因为pgsql实在是太出色之外,还因为我对dz代码在各个方面做了相当的优化。极大减小了数据库压力。详细在此http://www.oschina.net/question/126398_36342
附注2:以前服务器最高跑到90M带宽。后来因为cn备案问题不得已换了几次域名,折腾一番导致现在流量下降不少。不少老会员还没找到新庙门……
附注3:这可是dz7.2没有memcache机制哟!做过xcache测试,性能提升不明显,看来memcache在高流量下才对性能有提升,在目前并发流量下提升不明显。