TYPECHO五十万数据负载测试报告

Bug,需求以及想法
回复
tongdaren
帖子: 9
注册时间: 2008年 10月 15日 10:09

TYPECHO五十万数据负载测试报告

帖子 tongdaren »

首先,虽然现在已经快凌晨2点了,但是我仍然非常高兴的发部这个帖子,只是因为后台文章列表相当的流畅,后台搜索的速度也很好~~
后台对文章的添加、修改、删除等操作部分,因为程序没有完成,尚无法进行高数据量下的测试。等beta版出了以后再进行一次更详细的测试

先提供一下测试的基本信息:
1、硬件环境
CPU:amd 5000+
内存:2GB

2、软件环境
系统:Windows XP PRO Service Pack 2
Web服务器:Apache HTTP Server 2.0.58
PHP:5.2.6.6
MYSQL:MySQL Server 5.067

3、五十万数据插入程序test.php

代码: 全选

<?php
   /** 载入配置文件 */
   require_once 'config.inc.php';

   /** 连接数据库 */
   $db = Typecho_Db::get();

   /**设置超时*/
   set_time_limit(0);

   /**循环插入数据(50万数据对于blog来说好像变态了点)*/
   for($i=1;$i<500000;$i++){
     
   /** 插入关系 */
   $db->query($db->insert('table.relationships')->rows(array('cid' => $i, 'mid' => 1)));
             
   /** 插入内容 */
   $db->query($db->insert('table.contents')->rows(array('title' => _t('Typecho数据负载测试:名字的由来'), 'slug' => 'start', 'created' => 1211300209, 'modified' => 1211300209,
   'text' => _t('<p>曾经,有一个开源博客程序叫做Magike,在它发布1.2正式版之后,开发组的几个人开始商讨下一步的开发计划,有这样几个问题摆在了我们目前:

1、Magike博客程序是基于Magike Framework开发,保证了程序的效率和安全性,但是这个MVC的框架结构比较复杂,更适合用于开发大型项目,如果在博客程序开发中可以精简掉Magike Framework自带的模板引擎以及其他一些代码,就可以提供给用户一个更精巧的程序,这与我们希望代码越少越好的初衷一致,这直接推动了新版本从内核开始重写。

2、作为一个使用GPL V2发布的开源程序来说,虽然我们极力保证代码的规范性,但还是存在一些不足,比如程序注释不够详细,加上开发团队在对国际化的理解上走了一点弯路,与其逐步完善,不如从根本上重来,让新程序的开源血统更加纯洁。

3、Magike.com这个域名不在我们手里,而且Magike这个名字并不具备浅显易懂的含义,记忆起来有难度。

就在Magike团队决定为这个全新的博客程序拍脑袋想名字的时候,又有一名优秀的设计师fen加入了我们,Magike这个程序也获得越来越多用户的反馈,于是有人想到了Typecho这个名字。

Type,有打字的意思,博客这个东西,正是一个让我们通过打字,在网络上表达自己的平台。

Echo,意思是回声、反馈、共鸣,也是PHP里最常见、最重要的函数,相信大部分PHP爱好者都是从echo Hello,world;开始自己的PHP编程之路的。

将这两个词合并在一起,就有了Typecho,我们期待着越来越多的人使用我们开发的程序,也期待着越来越多的人加入到开源的行列里。

大家一起来,Typecho</p>'), 'author' => 1, 'type' => 'post', 'commentsNum' => 0, 'allowComment' => 'enable',
   'allowPing' => 'enable', 'allowFeed' => 'enable')));
   }

   /**显示完成*/
   echo "ok";
?>


文章选用的是TYPECHO名称的由来,去掉了几个标点。插入数据库前先清空relationships表和contents表。
然后就开始插入数据,一切顺利,用了大约8分钟。下面是插入数据后,数据库占用空间大小:
图片

打开后台大约用了3秒,然后就是接着打开管理文章页面,1秒开啊,很好很好很好。下面是截图:
图片

接着就是翻页了,大约1.5秒的样子…… 继续截图:
图片

接着就是直接从第二页翻到最后一页,也就是第25000页(囧,就算一天写10篇博客,不知道头发白了能不能写到50万篇)还可以,大约用了4秒:
图片

非常非常可惜的是,php.ini的脚本超时也设置的非常大了,我尝试了很多遍,不管是单篇还是首页,可就是没有能打开前台页面……

一片空白的前台页面上可能还要做一些文章才行……
头像
joyqi
帖子: 422
注册时间: 2007年 7月 24日 19:43
联系:

Re: TYPECHO五十万数据负载测试报告

帖子 joyqi »

非常感谢tongdaren同学凌晨不辞辛苦的工作。以下是我的一些看法

[list]翻页虽然只花了1秒多,但也不是我们要的速度,其实在这种情况下大多数时间都花在了count操作上,在没有缓存的情况下不大可能提高速度了[/list:u]
[list]如果说前台文章页无法打开我还可以理解的话,那么单篇文章页无法打开我就无法理解了。仔细研究了测试插入程序发现这里有问题。

代码: 全选

   /** 插入内容 */
   $db->query($db->insert('table.contents')->rows(array('title' => _t('Typecho数据负载测试:名字的由来'), 'slug' => 'start', 'created' => 1211300209, 'modified' => 1211300209,
   'text' => _t('<p>曾经,有一个开源博客程序叫做Magike,在它发布1.2正式版之后,开发组的几个人开始商讨下一步的开发计划,有这样几个问题摆在了我们目前:

1、Magike博客程序是基于Magike Framework开发,保证了程序的效率和安全性,但是这个MVC的框架结构比较复杂,更适合用于开发大型项目,如果在博客程序开发中可以精简掉Magike Framework自带的模板引擎以及其他一些代码,就可以提供给用户一个更精巧的程序,这与我们希望代码越少越好的初衷一致,这直接推动了新版本从内核开始重写。

2、作为一个使用GPL V2发布的开源程序来说,虽然我们极力保证代码的规范性,但还是存在一些不足,比如程序注释不够详细,加上开发团队在对国际化的理解上走了一点弯路,与其逐步完善,不如从根本上重来,让新程序的开源血统更加纯洁。

3、Magike.com这个域名不在我们手里,而且Magike这个名字并不具备浅显易懂的含义,记忆起来有难度。

就在Magike团队决定为这个全新的博客程序拍脑袋想名字的时候,又有一名优秀的设计师fen加入了我们,Magike这个程序也获得越来越多用户的反馈,于是有人想到了Typecho这个名字。

Type,有打字的意思,博客这个东西,正是一个让我们通过打字,在网络上表达自己的平台。

Echo,意思是回声、反馈、共鸣,也是PHP里最常见、最重要的函数,相信大部分PHP爱好者都是从echo Hello,world;开始自己的PHP编程之路的。

将这两个词合并在一起,就有了Typecho,我们期待着越来越多的人使用我们开发的程序,也期待着越来越多的人加入到开源的行列里。

大家一起来,Typecho</p>'), 'author' => 1, 'type' => 'post', 'commentsNum' => 0, 'allowComment' => 'enable',
   'allowPing' => 'enable', 'allowFeed' => 'enable')));

在插入文章内容的时候,我发现所有的文章都使用了同样的slug,实际上我们设计的slug是唯一的,这样才能起到近似主键的目的。我在安装程序中的似乎没有对这个索引做唯一性约束,这是我的一个失误,我已经在发表这篇文章时提交了我的改进。
[/list:u]
[list]但以上猜想仍不足以支持前台页打开过慢的情况,设计上应该与后台的查询是一致的,昨天我也去掉了几乎所有的连接查询。因此我希望能看到具体执行慢的语句。建议打开mysql慢语句查询的log,在配置文件my.ini(linux:my.cnf)里加上以下即可

代码: 全选

long_query_time = 1
log-slow-queries = /var/logs/slow.log

其中log-slow-queries = /var/logs/slow.log替换为你的路径。这样就可以记录查询时间一秒以上的慢语句了。
[/list:u]

再次感谢你的这份重要报告,我们期待着你的新消息。
tongdaren
帖子: 9
注册时间: 2008年 10月 15日 10:09

Re: TYPECHO五十万数据负载测试报告

帖子 tongdaren »

前台页打开过慢,我认为可能是因为前台页都是显示标题+内容的形式,而后台只是单单读取了标题

打开单叶问题你是对的,我没有考虑和发现到slug表的唯一性,否则可以插入随机字符串解决了,等再过几个版本来重新测试
tongdaren
帖子: 9
注册时间: 2008年 10月 15日 10:09

Re: TYPECHO五十万数据负载测试报告

帖子 tongdaren »

修正了测试程序。

用少量数据测试发现前台分页功能无效

50万的数据用了大约12分钟,比上次长点,可能随机数影响了效率

修正后的测试程序:

代码: 全选

<?php
   /** 载入配置文件 */
   require_once 'config.inc.php';

   /** 连接数据库 */
   $db = Typecho_Db::get();

   /**设置超时*/
   set_time_limit(0);

   /**创建随机数*/
   $n = null;

   /**循环插入数据(50万数据对于blog来说好像变态了点)*/
   for($i=1;$i<500000;$i++){

   /**获得随机数*/
   $n = mt_rand();
     
   /** 插入关系 */
   $db->query($db->insert('table.relationships')->rows(array('cid' => $i, 'mid' => 1)));
             
   /** 插入内容 */
   $db->query($db->insert('table.contents')->rows(array('title' => _t('Typecho数据负载测试:名字的由来'), 'slug' => $n, 'created' => 1211300209, 'modified' => 1211300209,
   'text' => _t('<p>曾经,有一个开源博客程序叫做Magike,在它发布1.2正式版之后,开发组的几个人开始商讨下一步的开发计划,有这样几个问题摆在了我们目前:

1、Magike博客程序是基于Magike Framework开发,保证了程序的效率和安全性,但是这个MVC的框架结构比较复杂,更适合用于开发大型项目,如果在博客程序开发中可以精简掉Magike Framework自带的模板引擎以及其他一些代码,就可以提供给用户一个更精巧的程序,这与我们希望代码越少越好的初衷一致,这直接推动了新版本从内核开始重写。

2、作为一个使用GPL V2发布的开源程序来说,虽然我们极力保证代码的规范性,但还是存在一些不足,比如程序注释不够详细,加上开发团队在对国际化的理解上走了一点弯路,与其逐步完善,不如从根本上重来,让新程序的开源血统更加纯洁。

3、Magike.com这个域名不在我们手里,而且Magike这个名字并不具备浅显易懂的含义,记忆起来有难度。

就在Magike团队决定为这个全新的博客程序拍脑袋想名字的时候,又有一名优秀的设计师fen加入了我们,Magike这个程序也获得越来越多用户的反馈,于是有人想到了Typecho这个名字。

Type,有打字的意思,博客这个东西,正是一个让我们通过打字,在网络上表达自己的平台。

Echo,意思是回声、反馈、共鸣,也是PHP里最常见、最重要的函数,相信大部分PHP爱好者都是从echo Hello,world;开始自己的PHP编程之路的。

将这两个词合并在一起,就有了Typecho,我们期待着越来越多的人使用我们开发的程序,也期待着越来越多的人加入到开源的行列里。

大家一起来,Typecho</p>'), 'author' => 1, 'type' => 'post', 'commentsNum' => 0, 'allowComment' => 'enable',
   'allowPing' => 'enable', 'allowFeed' => 'enable')));
   }

   /**显示完成*/
   echo "ok";
?>
tongdaren
帖子: 9
注册时间: 2008年 10月 15日 10:09

Re: TYPECHO五十万数据负载测试报告

帖子 tongdaren »

五十万数据依旧没能打开首页,
而单个页面也没有能打开,show.log内容:
# Time: 081114 19:10:56
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 24 Lock_time: 0 Rows_sent: 499999 Rows_examined: 999998
use typecho;
SELECT `created` FROM typecho_contents WHERE (`type` = 'post') AND (typecho_contents.`created` < '1226661031') ORDER BY typecho_contents.`created` DESC;
# Time: 081114 19:14:11
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2 Lock_time: 0 Rows_sent: 1 Rows_examined: 499999
SELECT COUNT(`cid`) AS `num` FROM typecho_contents WHERE (typecho_contents.`type` = 'post') AND (typecho_contents.`author` = '1');
# Time: 081114 19:14:28
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2 Lock_time: 0 Rows_sent: 0 Rows_examined: 499999
SELECT typecho_contents.`cid` , typecho_contents.`title` , typecho_contents.`slug` , typecho_contents.`created` , typecho_contents.`modified` , typecho_contents.`type` , typecho_contents.`text` , typecho_contents.`commentsNum` , typecho_contents.`meta` , typecho_contents.`template` , typecho_contents.`password` , typecho_contents.`allowComment` , typecho_contents.`allowPing` , typecho_contents.`allowFeed` , typecho_contents.`author` AS `authorId` FROM typecho_contents WHERE (typecho_contents.`type` = 'page') ORDER BY typecho_contents.`meta` ASC;
# Time: 081114 19:14:50
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 22 Lock_time: 0 Rows_sent: 499999 Rows_examined: 999998
SELECT `created` FROM typecho_contents WHERE (`type` = 'post') AND (typecho_contents.`created` < '1226661266') ORDER BY typecho_contents.`created` DESC;
# Time: 081114 19:15:44
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 4 Lock_time: 0 Rows_sent: 19 Rows_examined: 999998
SELECT typecho_contents.`cid` , typecho_contents.`title` , typecho_contents.`slug` , typecho_contents.`created` , typecho_contents.`modified` , typecho_contents.`type` , typecho_contents.`text` , typecho_contents.`commentsNum` , typecho_contents.`meta` , typecho_contents.`template` , typecho_contents.`password` , typecho_contents.`allowComment` , typecho_contents.`allowPing` , typecho_contents.`allowFeed` , typecho_contents.`author` AS `authorId` FROM typecho_contents WHERE (typecho_contents.`type` = 'post' OR typecho_contents.`type` = 'draft') ORDER BY typecho_contents.`created` DESC LIMIT 20 OFFSET 499980;
# Time: 081114 19:15:46
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2 Lock_time: 0 Rows_sent: 1 Rows_examined: 499999
SELECT COUNT(typecho_contents.`cid`) AS `num` FROM typecho_contents WHERE (typecho_contents.`type` = 'post' OR typecho_contents.`type` = 'draft');
# Time: 081114 19:22:15
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2 Lock_time: 0 Rows_sent: 0 Rows_examined: 499999
SELECT typecho_contents.`cid` , typecho_contents.`title` , typecho_contents.`slug` , typecho_contents.`created` , typecho_contents.`modified` , typecho_contents.`type` , typecho_contents.`text` , typecho_contents.`commentsNum` , typecho_contents.`meta` , typecho_contents.`template` , typecho_contents.`password` , typecho_contents.`allowComment` , typecho_contents.`allowPing` , typecho_contents.`allowFeed` , typecho_contents.`author` AS `authorId` FROM typecho_contents WHERE (typecho_contents.`type` = 'page' OR typecho_contents.`type` = 'page_draft') ORDER BY typecho_contents.`meta` ASC;
# Time: 081114 19:22:25
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2 Lock_time: 0 Rows_sent: 1 Rows_examined: 499999
SELECT COUNT(typecho_contents.`cid`) AS `num` FROM typecho_contents WHERE (typecho_contents.`type` = 'post' OR typecho_contents.`type` = 'draft');
# Time: 081114 19:23:19
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 3 Lock_time: 0 Rows_sent: 1 Rows_examined: 499999
SELECT COUNT(`cid`) AS `num` FROM typecho_contents WHERE (typecho_contents.`type` = 'post') AND (typecho_contents.`author` = '1');
# Time: 081114 19:24:03
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 23 Lock_time: 0 Rows_sent: 499999 Rows_examined: 999998
SELECT `created` FROM typecho_contents WHERE (`type` = 'post') AND (typecho_contents.`created` < '1226661818') ORDER BY typecho_contents.`created` DESC;
头像
joyqi
帖子: 422
注册时间: 2007年 7月 24日 19:43
联系:

Re: TYPECHO五十万数据负载测试报告

帖子 joyqi »

我知道问题所在了,因该是归档的问题
mayagamer
帖子: 18
注册时间: 2009年 4月 5日 07:52

Re: TYPECHO五十万数据负载测试报告

帖子 mayagamer »

咱们这么专业的测试和研究,typecho绝对会越来越强大的
回复