已掉线,重新登录

首页 > 绿虎论坛 > 历史版块 > 编程 > PHP > 讨论/求助

标题: 论坛执行时间严重不稳定的原因解析

作者: @Ta

时间: 2012-01-26

点击: 3139

    在绿虎论坛看贴,一般情况下不会执行用时超过0.3秒,但有时也会刷出5秒的超长时间。
    在绿虎论坛发贴,一般情况下需要1秒以上,甚至有时需要10多秒!
    为什么绿虎论坛的速度如此不稳定?在10秒的执行用时中程序到底干了什么?
    一般来说,绿虎论坛的“执行用时”跟同时发贴人数成反比。这个结论又是怎么得到的?
    且让我们来探索一番。
    虎绿林正在使用的SQLite数据库是一个嵌入式数据库。不像Mysql,有一个专用的数据库服务器来控制和管理多人同时访问。SQLite数据库是一个文件,对该文件的操作由每一个php进程分别独立进行。但是网站是多线程的,同一时间很可能有多个人同时访问,同时读写数据库。这就带来一个问题:如果两个进程同时对数据库的同一个地方进行写操作(插入、更新),那么肯定有一个会失败,从而导致数据丢失甚至数据库损坏。SQLite为了防止这种状况发生,采用了为文件加锁的方式:
    当一个进程需要写数据库文件的时候,它会向操作系统申请一个写锁。但是这个锁并不是马上就能拿到的,因为此时其他进程可能正在进行读写操作,需要等待它们操作完成才行。
    写锁有一个特点,就是排它性:同一时间只能有一个程序在写文件,并且此时任何程序都不能读文件。于是:
    老虎发贴,程序申请写锁,但此时刘付杰正在看贴,正在读数据库,所以老虎等待。
    老虎拿到了写锁开始往数据库写入贴子内容,此时安雨淋也来看贴了。但是文件被老虎锁定了,所以他等待。此时,又有两人刷新了论坛,等待。在一瞬间之后,李智欢和funch都回了贴,但是李智欢慢了一点,排在了最后。
    老虎写完数据库,要读的三人同时开始了读取。同时就是快啊,但是被老虎耽误了将近一秒。
    然后,funch写数据库。
    最后,轮到李智欢,7秒已经过去了。

    于是,大家明白了吧。
    
    
    当初选择SQLite是因为它的经济。要知道我的小说数据库book.db3已经高达170MB,请问我去哪里找这么大个Mysql,而且还得是免费的。而且对于不经常更新的小说库来说,并发性能完全够用了。并且SQLite最大的好处就是方便备份、移动,和网站文件一起打包带走即可,不像Mysql一个需要导入导出。
    也许SQLite并不太适合做论坛数据库吧,它写入速度真的很慢,进而影响了同一时间的读取速度,导致长时间等待……
    但是我目前仍然不准备换数据库,所以大家将就下吧。    
    
    另外顺便回复下李智欢在某个贴里的提问:索引是给数据库添加的,用来加速需要排序的查询(它的原理就是提前做一个排好序的目录树放在数据库里,要查询时直接翻目录,而不需要一个贴子一个贴子地找出来再“按发贴时间和置顶优先级”排序)。

[隐藏样式|查看源码]


『回复列表(9|隐藏机器人聊天)』

1. 继续
(/@Ta/2012-01-25 23:23//)

2. 老虎的教程最通俗易懂
(/@Ta/2012-01-25 23:23//)

3. 支持老虎
(/@Ta/2012-01-26 01:39//)

4. 写W3的时候我曾考虑过采集进SQLite,方便写搜索,后来觉得直接本地FILE快些,搜索嘛处理下GOOGLE的站内搜索就o了。老实说,只要在全站顶部加些代码,利用googlebot完全可以搞出一个定时的东西来,利用它搞采集是最爽的了…要知道,10000多篇教程没它不行…
(/@Ta/2012-01-26 03:14//)

5. 顶顶
(/@Ta/2012-01-26 10:02//)

6. 老虎。。听不懂啊。
(/@Ta/2012-01-26 17:26//)

7. 按8刷新]执行用时: 0.265秒
(/@Ta/2012-01-26 17:26//)

8. 那就是说,我们把一个论坛的数据库分为好几个bbs.db3,可以缓解压力。
(/@Ta/2012-01-26 21:59//)

9. @love封尘 。sqlite…
(/@Ta/2013-01-12 22:24//)

回复需要登录

9月17日 14:22 星期三

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1