谈我喜欢的作家-郑渊洁

作者 : admin 于 2011年03月07日, 23:31:01
2011
03-7

离开校园已经多年,书却一直伴我左右。从《科幻世界》到《飞碟探索》,从教科书到各种工具书;书卖了一批又一批,可办公桌和家里的书箱里总有沉甸甸的一摞书。

社会的竞争是残酷的,我更感觉到了“书到用时方恨少”的涵义。利用业余时间,我又走进了大学校园。令我惊讶的是,计算机专业居然开了语文课,我也碰上了一个国字脸上驾着金丝眼睛、白白净净满腹经纶的大学语文老师。

由于年初的一点意外,我没能赶上第一节课,不过我依然感受到这个老师的渊博-也许更因为我是工科生。

课间与老师攀谈,得知上次课后作业,随课上话题思路,遂写此文。

我喜欢书,毕业后每年买书的花费都近千元。当然大部分是计算机书籍,偶尔也在西三旗桥头买几本二手杂志,怀念一下青春。最近又喜欢上过期期刊,全新杂志但价格却不及全假三分之一。

要说我读过的书,可为杂而又杂:小说故事、杂文、诗歌;王朔的《过把瘾》、琼瑶的《碧云天》、长河落日刀等不知名的武侠故事。

要说我最喜欢那个作家,第一个下意识闪现的人物,就是郑渊洁。

平时我做心理测试,我的心理年龄远远超过了生理年龄:我在小学的时候让父亲带着我到石家庄最大的新华书店:中山路新华书专程去买一本小说:《奔腾验钞机》(后改名《我是钱》)-售货员惊讶,这么小的孩子爱看这种书!

其实爱上郑渊洁正是因为这部小说。当时父亲花几毛钱给我买了一本《童话大王》,里边节选了《奔腾验钞机》50元钞的经历。以一张钱的眼光来看世界,我被这个小说深深吸引了。

随着时光流逝,那本《奔腾验钞机》已经被我翻得惨不忍睹,中学的时候我也曾去书店寻找郑渊洁其他作品,但由于手头的拮据而不得放弃。

大学毕业后,得力于网络的便捷,我几乎阅读了郑渊洁所有的作品,被他的笔锋所深深得震撼。

他的笔法很犀利、尖刻,我总用鲁迅的作品来形容他的作品:他们的作品都是时代的匕首-鲁迅的作品作为一把手术刀在剔出社会的毒瘤,而又以一剂良药来治疗麻木的人;而郑渊洁的作品也非常尖刻得揭露一些社会现象给予讽刺,又赞扬了一些高尚的情操,凸现人性的美好。

《奔腾验钞机》这部作品以钱为第一视角,用其擅长的童话的方式去阐述不同的故事。这些故事深刻批判某些自私贪婪、拜金享乐型人群,这部小说描写人物心理活动比较多,通过人物心理的细腻揣摩和描写,使读者的内心与故事产生共鸣。

《飞马牌汽车》也是我喜欢的一部小说。书中大量夸张的描写批判了官僚主义、教条主义的思想,整部作品夸张让人忍俊不禁、却又阐明了作者此文的主旨。

郑渊洁的人也跟其作品一样:豪放、犀利。他儿子可直呼其名;儿子没有上学却自学成才;愤世嫉俗、远离污秽,为人低调不近商业活动。

也许、我喜欢的就是他的性格;他的书是我们心灵沟通的桥梁。

结合逍遥问问讲解如何利用LoadRunner进行性能测试

作者 : admin 于 2011年01月27日, 10:33:44
2011
01-27

最近群里聊到测试,我也拿公司测试部门的一个文档分享。我们测试组4个MM,负责平时的功能测试,性能测试和安全测试。既有很萌的测试主管,又有彪悍的千杯不醉,还有海吃不胖的瘦弱女生,包括由行政转为技术的全才。

PPT主要得靠演讲人的口述才能理解,这里PPT写的也比较详尽,大家可以看出一些功能和流程上的东西。

PPT部分内容删除,包括产品业务流程图,设计敏感账号和我们一些IP信息,不过不影响阅读。

附加一句:得用WPS打开。没装WPS的可以来这里下载 http://www.wps.cn/

顺便宣传我们的产品 逍遥问问

PPT下载

利用udf扩展mysql增加json_object函数

作者 : admin 于 2011年01月23日, 21:47:57
2011
01-23

其实已经有一个成形的mysql json编码的模块 http://www.mysqludf.org/lib_mysqludf_json/index.php

不过我们在使用的过程中,发现这个函数有版本兼容的问题,后看代码,发现它的json加密规则比较麻烦,没拆出来分析,就自己使用一个json类 http://sourceforge.net/projects/cjson/ 重写了一遍json_object函数。

目前在mysql-5.0.22版本上使用基本没问题,但在mysql5.5以上版本会有问题,udf接口格式好像有了变化。

mysql-5.0.22版本给出的例子是c++的代码。使用了extern语法,为了兼容gcc的语法。而我实际使用纯C环境,就抛弃了extern的语法。

udf_json源码下载

  1. file:udf_json.c
  2. #ifdef STANDARD
  3. #include <stdlib .h>
  4. #include <stdio .h>
  5. #include <string .h>
  6. #ifdef __WIN__
  7. typedef unsigned __int64 ulonglong; /* Microsofts 64 bit types */
  8. typedef __int64 longlong;
  9. #else
  10. typedef unsigned long long ulonglong;
  11. typedef long long longlong;
  12. #endif /*__WIN__*/
  13. #else
  14. #include <my_global .h>
  15. #include <my_sys .h>
  16. #include <m_string .h>
  17. #endif
  18. #include <mysql .h>
  19. #include <ctype .h>
  20. #include <float .h>
  21. #include "cJSON.h"
  22. #ifdef HAVE_DLOPEN
  23. my_bool json_object_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
  24. {
  25.   if (args->arg_count < 1)
  26.   {
  27.     strcpy(message,"Wrong arguments to metaphon;  Use the source");
  28.     return 1;
  29.   }
  30.   return 0;
  31. }
  32. void json_object_deinit(UDF_INIT *initid)
  33. {
  34. }
  35. char *json_object(UDF_INIT *initid, UDF_ARGS *args, char *result, unsigned long *length, char *is_null, char *error)
  36. {
  37. cJSON *root;
  38. char *out;
  39. int i = 0;
  40.  
  41. root=cJSON_CreateObject();
  42. for(i = 0;i<args->arg_count;i++)
  43. {
  44. if(args->arg_type[i] == STRING_RESULT)
  45. {
  46.     cJSON_AddStringToObject(root, args->attributes[i], args->args[i]);
  47. }
  48. else if(args->arg_type[i] == INT_RESULT)
  49. {
  50. cJSON_AddNumberToObject(root, args->attributes[i], *((int*)args->args[i])); //函数参数为double型,这里强转int是好使的,纳闷
  51. }
  52. }
  53. out=cJSON_Print(root);
  54.     cJSON_Delete(root);
  55. *length = strlen(out);
  56. return out;
  57. }
  58. #endif /* HAVE_DLOPEN */
  59.  
  60. file:make.sh
  61. #!/bin/sh
  62. gcc -Wall -I/opt/mysql-5.0.22/include/mysql -I. -shared udf_json.c cJSON.c -o lib_mysqludf_json.so
  63. cp -f ./lib_mysqludf_json.so /usr/lib/lib_mysqludf_json.so
  64. service mysqld restart
  65. </float></ctype></mysql></m_string></my_sys></my_global></string></stdio></stdlib>

编译完成,复制so文件至公共库,然后执行以下语句:

  1. drop function json_object;
  2. create function json_object returns string soname 'lib_mysqludf_json.so';

使用 :

  1. SELECT json_object(field1,field2……) AS jsdate FROM table;

PHP调用:

  1. $db = mysql_connect("127.0.0.1:3306","root","123456");
  2. mysql_select_db("test");
  3. $query = mysql_query("SELECT json_object(id,intval,value) FROM test LIMIT 6");
  4. while($row = mysql_fetch_array($query)){
  5.     var_dump(json_decode($row[0],true));
  6. }

结果显示:

array(3) {
["id"]=>
int(2)
["intval"]=>
int(43324)
["value"]=>
string(10) “fdsfdsfdsa”
}
array(3) {
["id"]=>
int(5)
["intval"]=>
int(432432432)
["value"]=>
string(10) “fdsafdsasa”
}

mysql5.5.8安装笔记

作者 : admin 于 2011年01月19日, 11:46:42
2011
01-19

mysql5.5.8对于守旧的人绝对是一种惨无人道的蹂躏。

我开始用mysql5.5.8了,被忽悠得天花乱坠,说性能提升,说主从同步迅速……

不过我是专用udf功能的,因为我常用的mysql稳定版本5.0.22官方说有点小bug,使用udf有点问题,被迫升级了5.5.8版本。

mysql5.5.8抛弃了我们钟爱的configure,而次用了cmake。

当然你要先安装cmake http://www.cmake.org/files/v2.8/cmake-2.8.3.tar.gz

cmake安装简单,tar后make && make install 搞定。

mysql5.5.8到官网下载 http://dev.mysql.com/downloads/mirror.php?id=399302#mirrors

tar出来,就找不到configure了,不过官方提供了高仿configure的转换脚本,不过神马都是浮云,自己折腾脚本吧

  1. cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.5.8 \
  2.       -DMYSQL_DATADIR=/opt/mysql-5.5.8/data \
  3.       -DSYSCONFDIR=/opt/mysql-5.5.8/etc \
  4.       -DINSTALL_PLUGINDIR=dir_name=/opt/mysql-5.5.8/plugin \
  5.       -DWITH_INNOBASE_STORAGE_ENGINE=1 \
  6.       -DWITH_ARCHIVE_STORAGE_ENGINE=1 \
  7.       -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
  8.       -DWITH_FEDERATED_STORAGE_ENGINE=1 \
  9.       -DWITH_PARTITION_STORAGE_ENGINE=1 \
  10.       -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock \
  11.       -DMYSQL_TCP_PORT=3306 \
  12.       -DENABLED_LOCAL_INFILE=1 \
  13.       -DEXTRA_CHARSETS=all \
  14.       -DDEFAULT_CHARSET=utf8 \
  15.       -DDEFAULT_COLLATION=utf8-general_ci \
  16.       -DMYSQL_USER=mysql

然后make && make install就行。

剩下的事情就跟老版本的一样了,不过我编译的时候没有成功安装 mysql_install_db 脚本,自己写了一个,也算成功完成任务了。

discuz论坛大表优化

作者 : admin 于 2011年01月11日, 23:15:17
2011
01-11

通过观察,大部分的dz论坛在数据量发展到一定程度,在线人数逐渐提高后,首先锁表的是sessions,这个表我已经写过多种优化的方式,不外乎寻找一些比mysql负载性能好的程序来代替这部分工作。但时间长了,随着在线人数继续增加,那个附加的程序也会面临瓶颈。提高硬件性能和软件性能固然能提高负载,但一旦到瓶颈,必须想其他的方案。

硬件和简约的程序能提高性能,在大数据量下,算法的优势就能体现出来了。

顺便提一下主从:很多人认为主从可以解决问题,其实未必。设想一主多从结构,假如主库写压力很大,那同样压力会同步到从库,会造成N个从库压力同时很大。事实上从库压力会小于主库,因为主库是多进程写,而从库是单进程写, 但总的来说,执行的语句不会少。所以,主从这种结构在一定情况下也就失去了优势。(在硬件资源充裕,压力不是很大的环境下,这种问题发生较少,在硬件条件比较差的一些环境下,这种瓶颈很容易表现出来)

这里拿discuz7的posts表举例,摆脱主从结构,硬件比较差,表很大,10G以上。

一个负载大的dz论坛,在线人数多,又比较活跃,那posts表的压力肯定不会小。在一个回复比较频繁,存储引擎使用myisam的posts表,锁表是经常发生的,我所遇见的问题发生的环境为:数据库单点,无主从,io压力中等。posts表频繁锁表,而造成查询排队,查询速度骤然下降。

在不提升硬件的情况下,要想提速,显然是比较困难的,大量的文本数据装入memcached显然也不合适。所以,这个问题我用优化数据存储的角度对数据表进行了改造。

TIPS:同样100M带宽的集线器和交换机,交换机的吞吐性能远远高于集线器,原因在于:交换机建立专有通道,避免了冲突。

而在mysql中,锁表可以形象描述为冲突了,读写冲突了。但如果我们分表,把读写分散,也许会好点。

分表规则:按照tid进行hash,分散到16个表中。

假设,一读一写,两个操作,同时进行,那么他们撞在一起的几率就是1。如果分为两个表,那么他们撞在一起的几率就是1/2 = 0.5,用一个函数来表示,就是F(x)=1/x ,显然,分的表越多,冲突的机会越小,锁表的几率就越少。即时锁表,影响的也只是1/x的数据,不会对所有的用户造成影响。

数据模型解释:如果是绝对同步发生,几率应该是 F(x)=1/((x-1)*x),但在计算机里,无论两个操作时间间隔多小,在cpu时间片上都是顺序执行,因为,函数我认定为:F(x)=1/x。

以上用数学的方式解释了算法优化对性能的提升。实际上,通过对逍遥论坛的用户行为统计:posts表95%以上的操作都是在读写,搜索和管理占小部分。

补充一种分表算法:在discuzX里,后台启用了分表,我没有细看,大概是把表按照时间段或者其他条件分开。我猜测,作者本意是拆分老数据,主表只留最新数据和一些命中高的数据。这种方式可以起到一定效果,但根据统计,大部分用户习惯浏览回复最新帖子,因此,大部分的读写还是定位到了一张表,也就是没有彻底解决读写冲突的问题。
还有一个朋友使用的是顺序分表,500w个pid一张表,但这个方法同上个方法,没解决冲突问题。
所以,在他的基础上,我考虑出按照tid进行hash分表的方案。

说到这里,分表又给我们带来了麻烦,有些查询并不能用tid主键进行定位,这里我用了mysql合并表,这个合并表可以合并16个分表,成为一个大表进行查询,而表名依然用原始的表明,这样,dz中原来的功能就不受影响了。

此方案已经实现,我用的新老数据+分别hash的方式,即32张表存储posts数据的方式。但未做压力测试。最近努力学习loadrunner使用,这个压测马上就可以进行了。

利用loadrunner做mysql压力测试

作者 : admin 于 2011年01月06日, 23:05:07
2011
01-6

loadrunner下的mysql c api

一个很简单的模拟用户访问论坛帖子的loadrunner测试脚本

最近跟测试组学习loadrunner的使用,测试组的姑娘们习惯用界面进行操作,而习惯linux平台使用的我很多功能都使用代码来实现了。

最近用loadrunner写了一个模拟社区用户压测论坛数据库的一个脚本,进行数据库的压力测试和优化工作。

用户行为分析:

在社区中,看帖的人是发帖人的10倍以上,而看帖人大概80%以上都在看新帖,20以下的用户有挖坟行为。

因此,设定如此的比率:每11个用户,1个发帖,8个看最近30%的帖,两个看老的70%的帖。

我的论坛帖子回复表大概是:973505个帖子的回复,两千多万的回帖。

根据这些数据,配合mysql的c api,写如下脚本:

注:脚本的my_mysql_insert()函数是有问题的,多线程下有一个资源符没处理好,因为还不太了解loadrunner的线程机制,所以留下了一个bug。

在做完这个脚本后,我发现我们测试机性能都不错,很难在一个5G大小的单表上主键查询造成很大的压力,所以,计划把dz论坛架设,用php+mysql真实环境下进行压测,这样可以顺便练习http函数下的loadrunner编程。

  1. globals.h
  2. #ifndef _GLOBALS_H
  3. #define _GLOBALS_H
  4. #include "lrun.h"
  5. #include "web_api.h"
  6. #include "lrw_custom_body.h"
  7. #include "modal_dialog_callbacks.h"
  8. #define random(x) (rand()%x)
  9. #include <mysql .h>
  10. #include <mysql_com .h>
  11. #include <mysql_time .h>
  12. #include <mysql_version .h>
  13. #include <typelib .h>
  14. #include <my_list .h>
  15. #include <my_alloc .h>
  16. #endif // _GLOBALS_H
  17. </my_alloc></my_list></typelib></mysql_version></mysql_time></mysql_com></mysql>
  1. vuser_init.c
  2. MYSQL *db;
  3. MYSQL_ROW record;
  4. vuser_init()
  5. {
  6. char sql[128];
  7. MYSQL_RES *results1;
  8.     lr_load_dll("libmysql.dll");
  9.     db = mysql_init(NULL);
  10. mysql_real_connect(db, "192.168.8.32", "root", "123456", "sunboyu_test", 3311, "/tmp/mysql3311.sock", 1);
  11.     
  12. sprintf(sql, "show tables");
  13. mysql_query(db, sql);
  14.     results1 = mysql_store_result(db);
  15.     while((record = mysql_fetch_row(results1)))
  16. {
  17.     lr_log_message("table = %s", record[0]);
  18.      }
  19. mysql_free_result(results1);
  20. return 0;
  21. }
  1. vuser_end.c
  2. vuser_end()
  3. {
  4.    mysql_close(db);
  5.    mysql_server_end();
  6. return 0;
  7. }
  1. Action.c
  2. Action()
  3. {
  4. int r1 = 0;
  5. char sql[128];
  6. r1 = random(11);            //10种用户,8种正常访问,两种在挖坟
  7. lr_log_message(" %d", r1);
  8.         if(r1==11)
  9.         {
  10.             my_mysql_insert();
  11.         }
  12.         else
  13.         {
  14.             my_mysql_query( r1 );
  15.         }
  16. return 0;
  17. }
  18.  
  19. int my_mysql_query( int randid )
  20. {
  21. int r2 = 0;
  22. int j = 0;
  23. int count = 0;
  24. int page = 0;
  25. char sql[128];
  26. MYSQL_RES *results2;
  27. if(randid&lt;2)  //老数据,小部分 20%
  28. {
  29. r2 = random(700000);
  30. sprintf(sql, "SELECT COUNT(*) AS count FROM posts_jx3 WHERE tid = %d;",r2);
  31. lr_log_message("%s",sql);
  32.         mysql_query(db, sql);
  33.         results2 = mysql_store_result(db);
  34.         while((record = mysql_fetch_row(results2)))
  35. {
  36.         lr_log_message("count = %d", record[0]);
  37.         }
  38. mysql_free_result(results2);
  39. page = count/10;
  40. lr_log_message("page = %d", page);
  41. for(j=0;j< =page;j++)
  42. {
  43. sprintf(sql, "SELECT *  FROM posts_jx3 WHERE tid = %d LIMIT %d,10;",r2,j);
  44. mysql_query(db, sql);
  45. lr_log_message("%s", sql);
  46. if (j>0) {
  47.   results2 = mysql_store_result(db);
  48.                   while((record = mysql_fetch_row(results2)))
  49.           {
  50.                      lr_log_message("pid = %d", record[0]);
  51.                    }
  52.           mysql_free_result(results2);
  53. }
  54. }
  55. }
  56. else //新数据,大部分 80%
  57. {
  58.         r2 = random(273505);
  59. r2 = r2+700000;
  60. sprintf(sql, "SELECT COUNT(*) AS count FROM posts_jx3 WHERE tid = %d;",r2);
  61. lr_log_message("%s",sql);
  62.         mysql_query(db, sql);
  63.         results2 = mysql_store_result(db);
  64.         while((record = mysql_fetch_row(results2)))
  65. {
  66. lr_log_message("count = %d", record[0]);
  67.         }
  68. mysql_free_result(results2);
  69. page = count/10;
  70. lr_log_message("page = %d", page);
  71.  
  72. for(j=0;j< =page;j++)
  73. {
  74. sprintf(sql, "SELECT *  FROM posts_jx3 WHERE tid = %d LIMIT %d,10;",r2,j);
  75. lr_log_message("%s", sql);
  76. mysql_query(db, sql);
  77. if (j>0) {
  78.   results2 = mysql_store_result(db);
  79.                   while((record = mysql_fetch_row(results2)))
  80.           {
  81.                       lr_log_message("pid = %d", record[0]);
  82.                    }
  83.           mysql_free_result(results2);
  84. }
  85. }
  86. }
  87. mysql_free_result(results2);
  88. return 0;
  89. }
  90.  
  91.  
  92.  
  93. int my_mysql_insert()
  94. {
  95. int t;
  96.     char sql[500];
  97. MYSQL_RES *results3;
  98. sprintf(sql,"%s","INSERT INTO posts_jx3 ( fid, tid, first, author, authorid, subject, dateline, message, useip, invisible, anonymous, usesig, htmlon, bbcodeoff, smileyoff, parseurloff, attachment, rate, ratetimes, status) VALUES ( 12345, 215053, 0, 'fdsafsdfsd', 2265065, '', 1240535917, 'fdsfsdfdsfd', '118.239.49.229', 0, 0, 0, 0, -1, -1, 0, 0, 0, 0, 0);");
  99. lr_log_message("%s", sql);
  100.     t = mysql_query(db, sql);
  101. if(t)
  102. {
  103. lr_log_message("%s", mysql_error(db));
  104. }
  105. else
  106. {
  107. lr_log_message("%s", "suc");
  108. }
  109. }

linux挂载ntfs分区

作者 : admin 于 2010年12月22日, 21:54:06
2010
12-22

最近有点数据需要在linux环境下处理,我用的是centos,最简方式安装,默认不支持ntfs格式。

查资料后,有两种方式可以使centos支持ntfs:1、重新编译内核 2、增加一个插件

重新编译内核成本有点高,而且风险比较大,尝试以下插件后,很好用:

http://tuxera.com/opensource/ntfs-3g-2010.10.2.tgz

下载后,解压,进入目录 ./configure && make && make install 即可

然后查看硬盘分区信息:fdisk -l

我的移动硬盘可以显示如下信息:

  1. Device Boot      Start         End      Blocks   Id  System
  2. /dev/sda1               2       19457   156280320    f  W95 Ext'd (LBA)
  3. /dev/sda5               2        1306    10482381    7  HPFS/NTFS
  4. /dev/sda6            1307        5222    31455238+   7  HPFS/NTFS
  5. /dev/sda7            5223       19457   114342606    7  HPFS/NTFS

挂载命令 mount -t ntfs-3g /dev/sda7 /data1

访问 /data1 即可访问/dev/sda7 分区

discuz全文检索lucene解决方案图例

作者 : admin 于 2010年12月17日, 11:17:12
2010
12-17

discuz论坛搜索方案

已经全部调试通过,正在往一个线上环境上部署。文档也在敢写之中,谢谢关注。

discuz优化心得

作者 : admin 于 2010年12月14日, 15:16:41
2010
12-14

自从09年10月份接到公司论坛改造升级任务到现在,逍遥论坛 http://bbs.xoyo.com 在性能和负载方面相对稳定,修改了原来的结构,单程序可以支持多论坛(模仿5d6d http://www.5dforum.com/ )。有几个参数可以参考:

平时在线人数:5000~10000人 峰值:50000+(超过5w后,统计表性能明显下降,关闭了统计)

之前每逢峰值论坛常挂,改造之后有充足的预案防止出问题,保证论坛用户能及时在论坛传达必要消息。

在论坛改造过程中,我写了很多文章来表述改造中的一些心得,也认识了很多朋友一起讨论dz的优化。其中最宝贵的经验,是一些无能为力的站长把他们的服务器交给我,让我亲手在一个大负载的服务器上去做优化,在这个过程中学到了很多系统优化方面的知识,更宝贵的是获得了大负载下dz的一些瓶颈点的数据。

由于考虑用户群的问题,很多技术没有办法用开源的软件实现,也无法找到替代品,考虑实际,很多dz站长自己并没有实力去涉入维护一个更改很多的论坛,所以我的方案并没有大量去应用。

在帮朋友优化的过程中,提到更多的是技术实力与维护、需求的增删与性能的平衡。

所以,我得出这样的结论供大家参考:

1、每个功能都会吃系统资源,充分考虑每个功能是否必须,不必须的功能一定要砍。

2、找系统压力点:根据我对逍遥论坛用户日志的分析,90%的压力集中在 forumdisplay.php viewthread.php上,而这些脚本的压力主要体现在表联查而造成的锁表上,最主要的表就是sessions表。sessions表集合了很多用户统计相关功能,因为,优化此表,结合上条原则,合理增删功能,达到压力减小。

3、硬件的优化。硬件优化也是我最近考虑的一个方案,想对于开发人员,硬件的开销还是很小的。合理升级硬件也是一个不错的方案。

以上结论是针对中小型网站已经碰到瓶颈的dz程序做出的建议。

而对于一个负载很大,并且有实力的团队,那在discuz上要做的文章就太多了。

1、拆表是必然的,而对于一些数据量不大但经常变动的表,完全可以全cache。

2、根据需求删改功能。discuz很强大, 但不是每个功能都是你必须使用的。

3、开源产品会给你很多灵感。

推荐的一些开源技术方案:

memcached(不用说了)

Tokyo Cabinet DBM:性能极佳的持久存储的keyvalue数据库

mysql udf http http://blog.s135.com/mysql-udf-http/ 让tt变成从库?

lucene 必须要替换discuz默认的搜索

你还有什么想法?

一时兴起,写此文。欢迎有兴趣的朋友加 discuz性能优化讨论群 qq:41886598

使用awstats对nginx的日志进行分析

作者 : admin 于 2010年12月10日, 16:13:31
2010
12-10

抛弃apache很长时间了,一直在用nginx,基于第三方的统计系统很多,故很久没有分析过web服务器的日志。最近日志突然暴增,从站长统计无法看出具体暴增的原因,故配置awstats进行分析。

awstats在nginx上运行,这个配置我没做过,所以,我依然使用apache作为awstats的服务器使用。只不过换一个端口而已。

apache配置:安装请看之前的日志,配置文件增加一行配置,具体为

  1. <directory "/opt/httpd-2.2.9/cgi-bin">
  2.     AddHandler cgi-script .pl .cgi  #这行即可
  3.     AllowOverride None
  4.     Options None
  5.     Order allow,deny
  6.     Allow from all
  7. </directory>

配置好,基本就可以启动了。注意端口号,别跟nginx重复了。

下载awstats:http://downloads.sourceforge.net/project/awstats/AWStats/7.0/awstats-7.0.tar.gz?r=http%3A%2F%2Fawstats.sourceforge.net%2F&ts=1291968393&use_mirror=cdnetworks-kr-1

解压后,找到 cgi-bin classes css icon js 这几个文件夹。其中cgi-bin里的文件放到apache的 cgi-bin目录下,其他放到apache的网站根目录。

然后访问 hostname:8080/cgi-bin/awstats.pl 看是不是有结果。

配置站点:

复制 cgi-bin目录下 awstats.model.conf 文件 为 awstats.hostname.conf

修改如下几个关键点

  1. LogFile="/home/www/log/www.google.com.log" #nginx的日志
  2. SiteDomain="www.google.com"
  3. HostAliases="localhost google.com 127.0.0.1 REGEX[myserver\.com$]"

配置完这些, 基本就可以使用了。

另外,还要生成报表:命令为

/opt/httpd-2.2.9/cgi-bin/awstats.pl -update -config=hostname 为了方便,可以加到crontab里。到这里就配置完了。

 Page 2 of 30 « 1  2  3  4  5 » ...  Last »