2008年11月14日星期五

AWSTATS性能优化

awstats是一款日志分析统计程序, 深受广大群众的喜爱。 其拥有较好性能以及丰富的分析结果。但是对于一些大访问量的网站而言,其统计速度仍然远远显得不够。

之前看过awstats官方的优化建议 awstats benchmark(中文翻译在这里), 除了DNSLookup此参数影响较大外,其他的一些参数优化并不能带来非常明显的性能提升,当然这些也是有必要去做的。

awstats官方给出的建议是当访问量超过 4,000,000/月时,推荐你使用Analog或者Webalizer ,这两款统计程序确实快!但是我们有不得不用awstats的理由。对于某些大的门户网站和公司来说,必然会自己开发一套统计系统进行实时统计,这种做法的好处这里就不多说了,但如果仅仅为了得知每天的IP、UV、PV及页面访问情况等,自己开发的成本无疑是一笔不小的开销。但对于日访问量上千万的站点来说,awstats的龟速实在让人无法忍受。

我们网站的日PV至发帖日为止是4000万左右,至今仍在以50-60%/月的速度在增加,日志解压缩后的大小将近200G, awstats每天自动对日志进行分析,整个统计时间大概是16-17小时之间。服务器配置:Xeon双核 1.6 * 2 ,4G内存 , 147G硬盘。

147G的硬盘当然无法解开100多G的日志文件外加一周内的日志,还不算系统自身所占用的磁盘空间。
所以这里我们用到了zcat , 在chedong的AWStats的千万级日志解决方案这篇文章中曾经提到过。zcat确实是一个好东西,可以不用解压缩对gzip、bz2等压缩文件进行输出,而根本不影响统计速度,甚至有所提高,因为perl在执行大文件操作时性能会受到影响。

要知道,加载一个页面同时也加载了许多图片、js、css等文件,我们假设这些访问记录都是在一个日志文件中,那么图片的记录就占了所有访问记录的80%以上。
那么,我们只需要过滤掉这些信息,统计时间也会降至原有时间的20% !
具体如下:
./awstats.pl -update -config=test -LogFile=”/bin/zcat test.log.gz |grep -v ‘.gif\|.png\|.jpg\|.js\|.css’ |”
这是使用了单独域名的前提下,再就是我们可以将组件单独拿到另外的域名来加载,这样达到了过滤的效果。(使用单独域名在大多数情况下不利于网站前端性能,这里不做讨论,详细请参考此文第八条)

第二步,可以通过修改awstats.pl文件来进行,其中 $LIMITFLUSH 默认值为5000,可以根据服务器自身内存进行增加,我增加到了100000,性能提高很明显。

如果你需要统计多个域名的日志,多核、多CPU的服务器则可以开启多个进程同时在后台进行分析,在shell中加上wait就可等待所有进程执行完后再进行之后的html生成。

2008年11月13日星期四

校内网开放平台宣布支持谷歌Open Social

腾讯科技讯 11月13日消息,校内网宣布,校内网开放平台正式支持Google的Open Social标准,允许开发者在校内网上将Open Social的开发标准用于开发应用插件程序(App)。

这是校内网在开放平台后,采用的第二套开发标准,作为Google的合作方之一,校内网方面表示“开放”是未来的方向,很愿意和任何开放平台合作并促进互联网的“开放”时代到来。

据校内网开放平台负责人介绍,校内网上第一个基于Open Social标准制作的App已经在测试阶段,这款由美国开发团队Rockyou开发的“Super Pet”除了可以在校内网上运行外,还可以在任何已经加入“Open Social”的社区网站,如Google的Orkut、天涯、51、豆瓣等网站上运行。

“从我们开放平台的那天开始,就认定了‘开放’是互联网的将来。”校内网开放平台负责人称:“所谓开放,是整个‘互联网的开放。所以我们很高兴加入Google的Open Social计划,也希望和其他开放了平台的网站一起,共同探讨开放之路。”

据了解,校内网是从今年7月8日开始正式开放平台。此前,媒体普遍认为2008年是互联网的开放年,中国互联网开始出现像校内网、Google中国、淘宝、豆瓣等最早的“开放平台”实践者。

2008年11月12日星期三

linux kill用法 、killall、pkill、xkill

一. 终止进程的工具 kill 、killall、pkill、xkill

终止一个进程或终止一个正在运行的程序,一般是通过 kill 、killall、pkill、xkill 等进行。比如一个程序已经死掉,但又不能退出,这时就应该考

虑应用这些工具。

另外应用的场合就是在服务器管理中,在不涉及数据库服务器程序的父进程的停止运行,也可以用这些工具来终止。为什么数据库服务器的父进程不能用

这些工具杀死呢?原因很简单,这些工具在强行终止数据库服务器时,会让数据库产生更多的文件碎片,当碎片达到一定程度的时候,数据库就有崩溃的

危险。比如mysql服务器最好是按其正常的程序关闭,而不是用pkill mysqld 或killall mysqld 这样危险的动作;当然对于占用资源过多的数据库子进程

,我们应该用kill 来杀掉。

1. kill

kill的应用是和ps 或pgrep 命令结合在一起使用的;

kill 的用法:

kill [信号代码] 进程ID

注:信号代码可以省略;我们常用的信号代码是 -9 ,表示强制终止;

举例:

[root@localhost ~]# ps auxf |grep httpd

root 4939 0.0 0.0 5160 708 pts/3 S+ 13:10 0:00 \_ grep httpd

root 4830 0.1 1.3 24232 10272 ? Ss 13:02 0:00 /usr/sbin/httpd

apache 4833 0.0 0.6 24364 4932 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4834 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4835 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4836 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd

apache 4840 0.0 0.6 24364 4928 ? S 13:02 0:00 \_ /usr/sbin/httpd
我们查看httpd 服务器的进程;您也可以用pgrep -l httpd 来查看;


我们看上面例子中的第二列,就是进程PID的列,其中4830是httpd服务器的父进程,从4833-4840的进程都是它4830的子进程;如果我们杀掉父进程4830

的话,其下的子进程也会跟着死掉;

[root@localhost ~]# kill 4840 注:杀掉4840这个进程;

[root@localhost ~]# ps -auxf |grep httpd 注:查看一下会有什么结果?是不是httpd服务器仍在运行?

[root@localhost ~]# kill 4830 注:杀掉httpd的父进程;

[root@localhost ~]# ps -aux |grep httpd 注:查看httpd的其它子进程是否存在,httpd服务器是否仍在运行?


对于僵尸进程,可以用kill -9 来强制终止退出;


比如一个程序已经彻底死掉,如果kill 不加信号强度是没有办法退出,最好的办法就是加信号强度 -9 ,后面要接杀父进程;比如;

[root@localhost ~]# ps aux |grep gaim

beinan 5031 9.0 2.3 104996 17484 ? S 13:23 0:01 gaim

root 5036 0.0 0.0 5160 724 pts/3 S+ 13:24 0:00 grep gaim

或 [root@localhost ~]# pgrep -l gaim

5031 gaim

[root@localhost ~]# kill -9 5031

2. killall

killall 通过程序的名字,直接杀死所有进程,咱们简单说一下就行了。

用法:killall 正在运行的程序名

killall 也和ps或pgrep 结合使用,比较方便;通过ps或pgrep 来查看哪些程序在运行;

举例:

[root@localhost beinan]# pgrep -l gaim

2979 gaim

[root@localhost beinan]# killall gaim

3. pkill

pkill 和killall 应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill 来杀掉。

应用方法:

#pkill 正在运行的程序名


举例:

[root@localhost beinan]# pgrep -l gaim

2979 gaim

[root@localhost beinan]# pkill gaim

4. xkill

xkill 是在桌面用的杀死图形界面的程序。比如当firefox 出现崩溃不能退出时,点鼠标就能杀死firefox 。当xkill运行时出来和个人脑骨的图标,哪个

图形程序崩溃一点就OK了。如果您想终止xkill ,就按右键取消;

xkill 调用方法:

[root@localhost ~]# xkill

二.Linux的kill命令与信号控制

信号是用来与守护程序和进程通信的。任何活动任务都是一个进程,而守护程序是等待对某些事件做出反应或者按照日程安排执行任务的后台服务。一个

程序必须有建在其中的信号处理程序用于捕获和应答信号。在LINUX中的signal 参考指南解释了各种不同信号和这些信号的用途。信号是由“kill”命令

发出的。kill -l命令可以显示一个可用信号列表及其编号。

所有的守护程序和进程都有一个进程ID(PID),例如使用ps命名所显示的内容:

$ ps aux

USER PID %CPU %MEM TTY STAT COMMAND

root 1 0.0 0.1 ? S init [2]

105 7783 0.0 0.2 ? Ss /usr/bin/dbus-daemon --system

hal 7796 0.0 0.7 ? Ss /usr/sbin/hald

postfix 7957 0.0 0.2 ? S qmgr -l -t fifo -u -c

nagios 8371 0.0 0.2 ? SNs /usr/sbin/nagios /etc/nagios/nagios.cfg

这个输出是经过简化的。你在系统中可以看到更多的行和栏目。如果某些进程消耗了你的全部CPU或者内存,你可以在这个输出的%CPU和%MEM列中发现它们

。找到失控的进程的一种更快捷的方法是使用top命令,因为按照默认的设置,使用占用CPU资源最多的进程在最上面显示。我们可以使用一条“yes”命令

来测试一下:

$ yes carla is teh awesum

这个命令将以很高的速度反复显示“carla is teh awesum”,直到你停止它运行。这将使你的CPU使用率达到警戒线。

$ top

...

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

12144 carla 25 0 31592 17m 13m R 93.4 3.5 0:50.26 konsole

22236 carla 15 0 2860 468 400 S 4.3 0.1 0:00.97 yes

 分析一下这个结果,你会发现一些有趣的事,你会发现,占用CPU最多的程序是konsole虚拟终端程序,而不是“yes”命令,这是因为“yes”命令是在

konsole终端程序中运行的。如果在一个“真正的”控制台(按Ctrl+alt+f2键)中运行同样的命令序列,你将看到“yes”命令被排在第一位。

有许多停止“yes”命令运行的方式。如果你要回到运行它的shell中,按CTRL+c键就可以了。或者你可以在另一个shell中用“kill”命令停止“yes”命

令的运行,Kill命令后面跟PID或者命令名称,如下如示:

$ kill 22236

或者

$ killall yes

按 CTRL+c键发出一个SIGINT(信号2),这个信号是键盘要求取得控制权的中断信号。kill和killall这两个命令按照默认的设置都发出一个 SIGTERM信号

(编号15)。程序中可以设置对SIGTERM信号(15)是捕捉或者忽略,或者以不同的方式解释。因此,如果你的程序对于KILL命令的反应与你预期不同,很可能

是被KILL的目标程序的问题。

终止一个父进程通常也终止了它的子进程。不过,情况并不总是如此。你知道子进程是什么吗?使用ps命令加上-f选项就可以看到,如下所示:

$ ps axf

22371 ? R 2:35 _ konsole [kdeinit]

22372 pts/3 Ss 0:00 | _ /bin/bash

24322 pts/3 S+ 0:00 | | _ yes carla is teh awesum

22381 pts/4 Rs 0:00 | _ /bin/bash

24323 pts/4 R+ 0:00 | | _ ps axf

现在,回到SIGHUP的话题

SIGHUP的发音是“sig-hup”,是signal hangup的缩写,含义是“中止信号”。你如何发送一个SIGHUP信号呢?这里有几种方式:

# kill -HUP [pid]

# killall -HUP [process-name]

# kill -1 [pid]

# killall -1 [process-name]

因此,你可以使用PID或者名称,信号名称或者号码。那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己的 init(初始化)文件

来控制服务是优先选择的方式,因为这些文件通常包含健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能明确地终止挂起和

失控的进程,而不必重新启动或者登出。

终止进程

正如你在关于信号的man page中所看到的,有十几种控制进程的方法。下面是一些常用的方法:

kill -STOP [pid]

发送SIGSTOP (17,19,23)停止一个进程,而并不消灭这个进程。

kill -CONT [pid]

发送SIGCONT (19,18,25)重新开始一个停止的进程。

kill -KILL [pid]

发送SIGKILL (9)强迫进程立即停止,并且不实施清理操作。

kill -9 -1

终止你拥有的全部进程。

SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略,但是,其它的信号可以。所以这是你的终极武器。

Bash shell的Kil命令l

Bash外壳包含一个内置的kill命令,当执行下面命令:

$ type -all kill

kill is a shell built-in

kill is /bin/kill

命令的结果表明有两个kill命令,一个是BASH的内置命令,另一个是/bin/kill可执行程序。一般来说这两个命令不太可能遇到冲突的情况,不过,如果你

确实遇到了kill命令行为异常时,你可以明确的指定/bin/kill命令。

你一定要进一步查阅下面的资源中列出的参考资源来了解Linux中kill的妙用,因为这是你进入维护Linux系统领域的门票。这些知识能够让你像做外科手

术一样对系统进行维护,而不用在遇到问题时每一次都重新启动系统,就像我们知道的某些蹩脚的操作系统那样。

资源

Linux Cookbook一书的第七章“开始和终止Linux”

bash (1) - GNU Bourne-Again Shell

yes (1) - 在被终止前反复打印字符

signal (7) - 可用信号列表

ps (1) - 报告当前进程的快照

kill (1) - 向一个进程发出信号

killall (1) - 按名字消灭进程

pkill (1) - 根据名字和其它属性查看或者发出进程信号

skill (1) - 发送一个信号或者报告进程状态

xkill (1) - 按照X资源消灭一个客户程序

ps命令

  前面介绍的两个命令都是用于查看当前系统用户的情况,下面就来看看进程的情况,这也是本章的主题.要对进程进行监测和控制, 首先必须要了解当前进程的情况,也就是需要查看当前进程,而ps命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程正在运行和 运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等等.总之大部分信息都是可以通过执行该命令得到的.

  ps命令最常用的还是用于监控后台进程的工作情况,因为后台进程是不和屏幕键盘这些标准输入/输出设备进行通信的,所以如果需要检测其情况,便可以使用ps命令了.

  ps [选项]

  下面对命令选项进行说明∶

  -e显示所有进程.

  -f全格式.

  -h不显示标题.

  -l长格式.

  -w宽输出.

  a显示终端上的所有进程,包括其他用户的进程.

  r只显示正在运行的进程.

  x显示没有控制终端的进程.

   O[+|-] k1 [,[+|-] k2 [,…]] 根据SHORT KEYS、k1、k2中快捷键指定的多 级排序顺序显示进程列表.对于ps的不同格式都存在着默认的顺序指定.这些默 认顺序可以被用户的指定所覆盖.其中“+”字符是可选的,“-”字符是倒转指 定键的方向.

  最常用的三个参数是u、a、x.

ps命令常用用法


1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。

  2)ps -A 显示所有程序。

  3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

  4)ps -e 此参数的效果和指定"A"参数相同。

  5)ps e 列出程序时,显示每个程序所使用的环境变量。

  6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

  7)ps -H 显示树状结构,表示程序间的相互关系。

  8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

  9)ps s 采用程序信号的格式显示程序状况。

  10)ps S 列出程序时,包括已中断的子程序资料。

  11)ps -t<终端机编号>

  指定终端机编号,并列出属于该终端机的程序的状况。

  12)ps u

  以用户为主的格式来显示程序状况。

  13)ps x

  显示所有程序,不以终端机来区分。

  最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

grep命令介绍

◎grep -- print lines matching a pattern (将符合样式的该行列出)

◎语法: grep [options]
PATTERN [FILE...]
grep用以在file内文中比对相对应的部分,或是当没有指定档案时,
由标准输入中去比对。 在预设的情况下,grep会将符合样式的那一行列出。

此外,还有两个程式是grep的变化型,egrep及fgrep。
其中egrep就等同於grep -E ,fgrep等同於grep -F 。

◎参数
1. -A NUM,--after-context=NUM
除了列出符合行之外,并且列出後NUM行。

ex: $ grep -A 1 panda file
(从file中搜寻有panda样式的行,并显示该行的後1行)

2. -a或--text
grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,
则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。

若加上-a参数则可将二进位档案视为文字档案搜寻,
相当於--binary-files=text这个参数。

ex: (从二进位档案mv中去搜寻panda样式)
(错误!!!)
$ grep panda mv
Binary file mv matches
(这表示此档案有match之处,详见--binary-files=TYPE )
$
(正确!!!)
$ grep -a panda mv

3. -B NUM,--before-context=NUM
与 -A NUM 相对,但这此参数是显示除符合行之外
并显示在它之前的NUM行。

ex: (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file

4. -C [NUM], -NUM, --context[=NUM]
列出符合行之外并列出上下各NUM行,预设值是2。

ex: (列出file中除包含panda样式的行外并列出其上下2行)
(若要改变预设值,直接改变NUM即可)
$ grep -C[NUM] panda file

5. -b, --byte-offset
列出样式之前的内文总共有多少byte ..

ex: $ grep -b panda file
显示结果类似於:
0:panda
66:pandahuang
123:panda03

6. --binary-files=TYPE
此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:
1.若有符合的地方:显示Binary file 二进位档名 matches
2.若没有符合的地方:什麽都没有显示。

若TYPE为without-match,遇到此参数,
grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。

若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。

Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。

7. -c, --count
不显示符合样式行,只显示符合的总行数。
若再加上-v,--invert-match,参数显示不符合的总行数。

8. -d ACTION, --directories=ACTION
若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。
预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;
若ACTION是skip(略过),资料夹会被grep略过:
若ACTION是recurse(递),grep会去读取资料夹下所有的档案,
此相当於-r 参数。

9. -E, --extended-regexp
采用规则表示式去解释样式。

10. -e PATTERN, --regexp=PATTERN
把样式做为一个partern,通常用在避免partern用-开始。

11. -f FILE, --file=FILE
事先将要搜寻的样式写入到一个档案,一行一个样式。
然後采用档案搜寻。
空的档案表示没有要搜寻的样式,因此也就不会有任何符合。

ex: (newfile为搜寻样式档)
$grep -f newfile file

12. -G, --basic-regexp
将样式视为基本的规则表示式解释。(此为预设)

13. -H, --with-filename
在每个符合样式行前加上符合的档案名称,若有路径会显示路径。

ex: (在file与testfile中搜寻panda样式)
$grep -H panda file ./testfile
file:panda
./testfile:panda
$

14. -h, --no-filename
与-H参数相类似,但在输出时不显示路径。

15. --help
产生简短的help讯息。

16. -I
grep会强制认为此二进位档案没有包含任何搜寻样式,
与--binary-files=without-match参数相同。

ex: $ grep -I panda mv

17. -i, --ignore-case
忽略大小写,包含要搜寻的样式及被搜寻的档案。

ex: $ grep -i panda mv

18. -L, --files-without-match
不显示平常一般的输出结果,反而显示出没有符合的档案名称。

19. -l, --files-with-matches
不显示平常一般的输出结果,只显示符合的档案名称。

20. --mmap
如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。
在某些状况,--mmap 能产生较好的效能。 然而,--mmap
如果运作中档案缩短,或I/O 错误发生时,
可能造成未定义的行为(包含core dump),。

21. -n, --line-number
在显示行前,标上行号。

ex: $ grep -n panda file
显示结果相似於下:
行号:符合行的内容

22. -q, --quiet, --silent
不显示任何的一般输出。请参阅-s或--no-messages

23. -r, --recursive
递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。

24. -s, --no-messages
不显示关於不存在或无法读取的错误讯息。

小: 不像GNU grep,传统的grep不符合POSIX.2协定,
因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。
Shell Script倾向将传统的grep移植,避开-q及-s参数,
且将输出限制到/dev/null。

POSIX: 定义UNIX及UNIX-like系统需要提供的功能。

25. -V, --version
显示出grep的版本号到标准错误。
当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。

26. -v, --invert-match
显示除搜寻样式行之外的全部。

27. -w, --word-regexp
将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。

28. -x, --line-regexp
将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。

2008年11月11日星期二

UNIX命令-后台运行命令

UNIX命令-后台运行命令

后台运行某个命令

后台运行某个命令或SHELL,如

find / -type f -name "crontab" 2> temp | xagrs ll &

若-type d 则会列出crontab文件夹内的文件

若要在服务器上一直运行某个命令或SHELL,则形式为 nohup a.sh &

Linux系统下运行命令时CTRL+Z的作用

Linux系统下运行命令时CTRL+Z的作用

  命令运行时使用CTRL+Z,强制当前进程转为后台,并使之停止。

  1. 使进程恢复运行(后台)

  (1)使用命令bg

  Example:

  zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv01

  *这里使用CTRL+Z,此时serv01是停止状态*

  [1]+ Stopped ./tcpserv01

  zuii@zuii-desktop:~/unp/tcpcliserv$ bg

  [1]+ ./tcpserv01 & *此时serv01运行在后台*

  zuii@zuii-desktop:~/unp/tcpcliserv$

  (2)如果用CTRL+Z停止了几个程序呢?

  Example:

  zuii@zuii-desktop:~/unp/tcpcliserv$ jobs

  [1]- Running ./tcpserv01 &

  [2]+ Stopped ./tcpcli01 127.0.0.1

  zuii@zuii-desktop:~/unp/tcpcliserv$ bg %1

  bash: bg:任务 1 已转入后台 *后台运行*

  2. 使进程恢复至前台运行

  Example:

  zuii@zuii-desktop:~/unp/tcpcliserv$ ./tcpserv04

  [1]+ Stopped ./tcpserv04

  zuii@zuii-desktop:~/unp/tcpcliserv$ fg

  。/tcpserv04

  总结:

  (1) CTRL+Z停止进程并放入后台

  (2) jobs 显示当前暂停的进程

  (3) bg %N 使第N个任务在后台运行(%前有空格)

  (4) fg %N 使第N个任务在前台运行

  默认bg,fg不带%N时表示对最后一个进程操作!

网站统计