几种开源或商业的WEB服务器

六款小巧的HTTP Server[C语言]

Submitted by keminar on 2010, February 5, 11:14 PM. 开源软件

1、micro_httpd – really small HTTP server
特点:
支持安全的 .. 上级目录过滤
支持通用的MIME类型
支持简单的目录
支持目录列表
支持使用 index.html 作为首页
Trailing-slash redirection
程序总共代码才200多行
这个httpd适合学习简单的Web Server编写学习,因为它只有一个简单的框架,只能够处理简单的静态页,可以考虑用来放静态页。
官方地址:http://www.acme.com/software/micro_httpd/
下载地址:http://www.acme.com/software/micro_httpd/micro_httpd_12dec2005.tar.gz

2、mini_httpd – small HTTP server
特点:
支持GET、HEAD、POST方法
支持CGI功能
支持基本的验证功能
支持安全 .. 上级目录功能
支持通用的MIME类型
支持目录列表功能
支持使用 index.html, index.htm, index.cgi 作为首页
支持多个根目录的虚拟主机
支持标准日志记录
支持自定义错误页
Trailing-slash redirection
mini_httpd 也是相对比较适合学习使用,大体实现了一个Web Server的功能,支持静态页和CGI,能够用来放置一些个人简单的东西,不适宜投入生产使用。
官方地址:http://www.acme.com/software/thttpd/
下载地址:http://www.acme.com/software/mini_httpd/mini_httpd-1.19.tar.gz

3、thttpd – tiny/turbo/throttling HTTP server
thttpd中是一个简单,小型,轻便,快速和安全的http服务器:
简单:它能够支持HTTP/1.1协议标准,或者超过了最低水平
小巧:它具有非常少的运行时间,因为它不fork子进程来接受新请求,并且非常谨慎的分配内存(性能对比表:http://www.acme.com/software/thttpd/benchmarks.html)
便携:它能够在大部分的类Unix系统上运行,包括FreeBSD, SunOS 4, Solaris 2, BSD/OS, Linux, OSF等等
快速:它的速度要超过主流的Web服务器(Apache, NCSA, Netscape),在高负载情况下,它要快的多
安全:它努力的保护主机不受到攻击,不中断服务器

thttpd 类似于lighttpd,对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现。因此效能很好。同时它还 有一个特点就是基于URL的文件流量限制,这对于下载的流量控制而言是非常方便的。象Apache就必须使用插件实现,效率较thttpd低。
thttpd跟lighttpd类似,适合静态资源类的服务,比如图片、资源文件、静态HTML等等的应用,性能应该比较好,同时也适合简单的CGI应用的场合。
官方地址:http://www.acme.com/software/thttpd/
下载地址:http://www.acme.com/software/thttpd/thttpd-2.25b.tar.gz

4、lighttpd – light footprint + httpd = LightTPD
Lighttpd是一个德国人领导的开源软件,其根本的目的是提供一个专门针对高性能网站,安全、快速、兼容性好并且灵活的web server环境。具有非常低的内存开销,cpu占用率低,效能好,以及丰富的模块等特点。
lighttpd 是众多OpenSource轻量级的web server中较为优秀的一个。支持FastCGI, CGI, Auth, 输出压缩(output compress), URL重写, Alias等重要功能,而Apache之所以流行,很大程度也是因为功能丰富,在lighttpd上很多功能都有相应的实现了,这点对于apache的用 户是非常重要的,因为迁移到lighttpd就必须面对这些问题。
实用起来lighttpd确实非常不错,apache主要的问题是密集并发下, 不断的fork()和切换,以及较高(相对于 lighttpd而言)的内存占用,使系统的资源几尽枯竭。而lighttpd采用了Multiplex技术,代码经过优化,体积非常小,资源占用很低, 而且反应速度相当快。
利用apache的rewrite技术,将繁重的cgi/fastcgi任务交给lighttpd来完成,充分利用两者的优点,现在那台服务器的负载下降了一个数量级,而且反应速度也提高了一个甚至是2个数量级!
lighttpd 适合静态资源类的服务,比如图片、资源文件、静态HTML等等的应用,性能应该比较好,同时也适合简单的CGI应用的场合。

官方地址:http://www.lighttpd.net/
下载地址:http://www.lighttpd.net/download/lighttpd-1.4.16.tar.gz

5、SHTTPD – Simple HTTPD
Shttpd 是另一个轻量级的web server,具有比thttpd更丰富的功能特性,支持CGI, SSL, cookie, MD5认证, 还能嵌入(embedded)到现有的软件里。最有意思的是不需要配置文件!由于shttpd可以嵌入其他软件,因此可以非常容易的开发嵌入式系统的 web server,官方网站上称shttpd如果使用uclibc/dielibc(libc的简化子集)则开销将非常非常低。

特点:
小巧、快速、不膨胀、无需安装、简单的40KB的exe文件,随意运行
支持GET, POST, HEAD, PUT, DELETE 等方法
支持CGI, SSL, SSI, MD5验证, resumed download, aliases, inetd模式运行
标准日志格式
非常简单整洁的嵌入式API
dietlibc friendly. NOT that friendly to the uClibc (*)
容易定制运行在任意平台:Windows, QNX, RTEMS, UNIX (*BSD, Solaris, Linux)
由于shttpd可以轻松嵌入其他程序里,因此shttpd是较为理想的web server开发原形,开发人员可以基于shttpd开发出自己的webserver!
官方网站:http://shttpd.sourceforge.net/
下载地址:http://jaist.dl.sourceforge.net/sourceforge/shttpd/shttpd-1.38.tar.gz

6、tinyhttpd

tinyhttpd is a very simple webserver. It is not for production use; instead it is primarily for a learning tool for persons investigating the http protocol and UNIX system calls.

Despite its simple nature, tinyhttpd supports threading and CGI scripts! For more information, see the accompanying README file and the code itself.

tinyhttpd is tested on Sparc Solaris and will probably not run on other operating systems as-is. However, commenting out the line that does threading may be all that is required to port it. I would like to autoconfiscate tinyhttpd at some point in time to help make it more portable.

There is no downloadable release of tinyhttpd, yet. Until then, you can get it by anonymous CVS.

The real homepage for tinyhttpd is the project page

地址:http://tinyhttpd.sourceforge.net/

转载自:http://blog.linuxphp.org/?action=show&id=60

【译】几种Web服务器比较

注意到有这款服务器nginx。没听过,一查有了下文。其中有一个还是听过的。对照翻译了下文。

Apache and IIS are the most common web servers in use today, but they are far from alone. There is a huge amount of web server software out there, both free and commercial.

到目前,Apache和IIS是用的最为普遍的Web服务器,但是它们太过单一,在此之外这里还有许多Web服务器软件,或是免费的或是商业的。

In this article we present four popular alternative web servers: Lighttpd, Nginx, LiteSpeed and Zeus. The first two are free and open source while the other two are commercial, closed-source alternatives. What they all have in common is that they focus on high performance.

本文我们介绍四种最受欢迎的Web服务器: Lighttpd, Nginx, LiteSpeedZeus。 前两个都是免费且开源的,而另两种都是商业的,闭源的。它们的共同点在于都着重于高性能上。

We will also take a look at how many websites are actually using these web servers.

我们看看有多少网站实际上在使用它们。

But first a brief presentation of each of one:

首先一个简短的介绍其中之一:

Lighttpd
  • Brief info: Pronounced “Lighty”, Lighttpd is as the name implies a small, lightweight web server which has a low memory footprint and light CPU load. Lighttpd is a good alternative to serve static content but it has also gained recognition in the Ruby on Rails and PHP communities.

    Lighttpd 的名称暗示小,轻量级web服务器,占用内存小且cpu负荷低。Lighttpd 是服务于静态内容的不错选择。然而它更被公认为是用在Ruby 和 PHP 上。

  • Used by: Wikimedia (Wikipedia), Sourceforge, YouTube, The Pirate Bay, Meebo, Imageshack, Sendspace, Mininova.
  • Cost: Free
  • Open Source: Yes
  • OS platforms: Linux, freeBSD, Solaris, MacOS X, Windows (under Cygwin)
  • Homepage: http://www.oschina.net/p/lighttpd
Nginx
  • Brief info: Pronounced “engine X”, Nginx is a lightweight web server and reverse proxy. originally written by Igor Sysoev for Rambler.ru (Russia’s second most visited website). Nginx is known for stability and simple configuration in addition to its low resource consumption. It can also act as an IMAP/POP3 proxy.

    Nginx 是一款轻量级web服务器和反向代理。最初由Igor Sysoev 编写。它的出名在于其稳定性和简单的配置,除此之外低资源消耗。 还有它可以作为IMAP/POP3协议。

  • Used by: Yellow Pages, Hulu, Zimbra, the Friends for Sale Facebook app, Rambler, and it also seems that Wordpress.com just started using it instead of LiteSpeed.
  • Cost: Free
  • Open Source: Yes
  • OS platforms: Linux, FreeBSD, Solaris, MacOS X
  • Homepage: http://www.oschina.net/p/nginx
LiteSpeed
  • Brief info: LiteSpeed is a commercial web server designed specifically for large websites. One of LiteSpeed’s advantages is that it can read Apache configurations directly which makes it easy to integrate with existing products to replace Apache. The server is lightweight and as the name implies very fast.

    LiteSpeed 一种被特别设计用作大型网站的商业web服务器。 其中一个优势就是它能直接读取Apache 的配置信息。并轻易将它现有的产品结合在一起来代替Apache 。这种服务器是轻量级的就如它的名字暗示出非常快。

  • Used by: Wordpress (until recently at least, but now Wordpress.com appears to be using nginx), Twitter, GigaOm, Bravenet.
  • Cost: Free to $1,299 depending on the edition.
  • Open Source: No
  • OS platforms: Linux, FreeBSD, Solaris, MacOS X
  • Homepage: http://www.ruanku.com/p/litespeedtech-web-server
Zeus
  • Brief info: Zeus web server is a high performance web server. It has received PC Magazine Editors’ Choice award and also the eWeek/PC Magazine Innovation in Infrastructure award. Zeus is a highly flexible enterprise product.

    Zeus web server 是一个高性能的web服务器。它曾被PC Magazine Editors’ Choice 授过奖并且eWeek/PC Magazine Innovation 也授予过它奖项。Zeus 是一种高度灵活的企业产品。

  • Used by: Sony, Telefónica, Virgin media, phpBB.
  • Cost: $1,700 up to two physical CPUs; $850 per additional CPU.
  • Open Source: No
  • OS platforms: Linux, FreeBSD, Solaris, HP-UX
  • Homepage: http://www.ruanku.com/p/zeus-web-server

How many websites are using these web servers?

According to Netcraft, Lighttpd is currently the most common of these four web servers. On April 1, the numbers of websites for each were as follows:
有多少网站在使用它们?
根据Netcraft统计,Lighttpd 是当前这四种服务器中最普遍的。在4月1日统计到的网站数字。

Lighttpd: 1,495,308
Nginx: 1,018,503
LiteSpeed: 668,030
Zeus: 420,477

These positions were not always the same, though. As you can see by the following graph, which shows the numbers from January 2006 to April 2008, the situation has changed significantly over time.

然而这个形势并不一直是一样的。通过下图你可以看到从2006年1月到2008年4月,形势随着时间而改变着。


The graph is based on data from Netcraft (their web server survey archives).

The huge leap for Lighttpd in January-March of 2007 is most likely due to one or more web hosting or domain registration companies switching over to Lighttpd either for their regular pages, or for parked pages, or both. If anyone knows what happened there in more detail, please feel free to let us know in the comments.

2007年1月到3月,很可能归咎于一个或多个web服务商或域名注册公司转变使用Lighttpd 。发生了什么如果有人知道的更详细些……

Interestingly, the number of servers using the Zeus web server has remained quite constant over the last two years, and even decreased a little. That said, it is mainly an enterprise solution, so this is perhaps not so surprising.

非常有趣的是,过去两年使用Zeus 作为服务器的数量维持在一个非常恒定的状态。而且减少了一点点。可以说,它主要是针对企业解决方案。所以从这点上是不值得惊讶的。

The two web servers that have been growing the fastest lately are Nginx and LiteSpeed. Nginx recently passed the one-million-websites mark.

Nginx 和 LiteSpeed 这两种服务器增长速度很快。近来Nginx 已经超过了一百万个站点

These numbers of course still pale next to Apache’s roughly 83 million websites, but there is no doubt that these alternative web servers are gaining in popularity. Who knows, one of them may be just right for you?

当然这些数字对于Apache的大概8300万来说不值一提。但仍无置疑的是这些可供选择的服务器越来越受欢迎。有谁知道,其中之一很可能是非常适合你的?

转载自:http://www.oschina.net/bbs/thread/4056

From: http://www.cnblogs.com/wuhenke/archive/2010/06/23/1763868.html

Ubuntu下中文输入解决(SCIM in English Locale)

Ubuntu下中文输入解决(SCIM in English Locale)

文是通过阅读学习了以下几篇帖子,试用而来,整理整理而已:

(1)安装中文支持和输入法SCIM

(2)英文Locale下使用中文输入法

(3)ubuntu8.10英文环境下firefox调用中文输入scim

致谢先。

步骤很简单,首先当然是确保正确的安装了中文输入法:

1.首先更要安装中文系统支持。

中文环境的话,就是 系统->系统管理->语言支持
英文环境( System->Administration->Language Support)
当你第一次设置语言支持时,可能会弹出一个对话框,提示你the language support is not installed completely(语言支持没有完全安装),这时候点安装,就可以安装更多的语言支持。
然後,让我们找到列表里的chinese,打上勾,ubuntu会自动帮你下载中文包。
当这些中文包安装好时,确定下面的Default Language是 chinese (china),然後保存,按 ctrl+alt+backspace注销,重启X-windows(图形界面),重启後,界面成中文了。
Ubuntu8.04的默认字体是文泉译正黑,感谢文泉译组织对开源字体的贡献! (1)

2.输入法的安装,我使用的是安装最方便的SCIM,直接可在软件安装管理里找到,如果设置的缺省语言是中文的话,这时应该就可以启用拼音输入了:

输入法安装及设置
如果你成功安装语言支持,重新启动后,按下 Ctrl+空格,SCIM(输入法)被激活了,就可以输入中文了(ubuntu默认安装的是SCIM输入法)。 打开 系统->首选项->scim设置,输入法引擎->全局设置,选择你需要的输入法吧。
建 议先设置一下输入法,因为是默认的scim输入法可能会与realplay、acrobat reader、openoffice等程序有冲突,所以使用scim-bridge替换scim。安装scim-bridge 和scim-qtimm。请确保已正确设置中文环境,打开终端,执行以下命令,或使用《新立得软件管理器》,在其中搜索”scim-bridge”、 “scim-qtimm”并标记安装。
在终端输入

复制内容到剪贴板

代码:

sudo im-switch -s scim -z default
sudo apt-get install scim-qtimm
sudo apt-get install scim scim-pinyin scim-tables-zh im-switch scim-qtimm scim-bridge scim-bridge-client-gtk scim-bridge-client-qt scim-bridge-agent

编辑im-switch生成的scim配置文件

复制内容到剪贴板

代码:

gksu gedit /etc/X11/xinit/xinput.d/scim

将默认的 GTK_IM_MODULE=scim 修改为 GTK_IM_MODULE=”scim-bridge”。
另外,在scim输入法中进行了如下设定:
scim设置->全局设置->将预编辑字符串嵌入到客户端中 前的勾去掉
scim设置->gtk->嵌入式候选词标的勾去掉
事实上SCIM输入法还是会与一些程序有冲突的,所以在某些软件在安装后要配置文件。
如果大家想使用其他输入法可以 fcitx输入法安装及设置(Kubuntu下推荐使用)(1)

3.但是很多时候,其实有人(比如我)确实不想用中文作为系统缺省——因为字体显示啊,菜单排列啊,都有点不习惯,特别是所谓的中文版都不可能是完全的中文化,所以宁可继续用英文的系统语言,所以这种找抽的行为就意味着额外的劳动:

如果你在英文locale下,正确安装scim或fcitx后仍无法正常使用输入法,解决的方法如下,用im-switch来切换输入法设置:

sudo aptitude install im-switch

如果你用scim,运行

sudo im-switch -s scim -z all_ALL
im-switch -s scim -z all_ALL (2)

而如果不想安装im-switch的话,也可以手动修改:

编辑 /etc/gtk-2.0/gtk.immodules(如果存在的话) 或者 /usr/lib/gtk-2.0/2.10.0/immodule-files.d/libgtk2.0-0.immodules 文件,在xim 的 local 增加 en 也就是说:

“xim” “X Input Method” “gtk20″ “/usr/share/locale” “ko:ja:th:zh”

改成

“xim” “X Input Method” “gtk20″ “/usr/share/locale” “en:ko:ja:th:zh”

保存退出,重启后再进就ok了.(2)

4.即使现在英文的系统也可以使用中文输入了,但是在某些程序,比如Firefox当中,仍然可能有问题(或者按照帖子的说法,是必然有问题):

在这里/etc/X11/xinit/xinput.d/
举例来说
如果我们的系统环境是英文,那么我就就修改all_ALL或者default文件all_ALL是default的软链接。
如果是系统为中文环境,输入法有问题,那就要改zh_CN了,以此类推,明白?
在修改之前,先看看为什么中文环境下firefox输入中文没问题?
打开zh_CN
看到这些关键字
GTK_IM_MODULE=scim-bridge
QT_IM_MODULE=scim-bridge
在打开default看看
什么? 空的,没写?难怪输入不了中文,
GTK_IM_MODULE=
QT_IM_MODULE=

我们把它补上
GTK_IM_MODULE=scim-bridge
QT_IM_MODULE=scim-bridge

在log out,重新登陆英文环境试试,firefox应该可以输入中文了。(3)

5.最后还是要记得把SCIM放到自动加载的session当中,免得每次要手动来切换:

另外Ubuntu 8.10中 , scim不能自动加载,总不能每次登陆都让我用命名行输入scim吧,烦死了
在这里把它加入到登陆要加载的应用程序中去
System->Preferences->Sessions->startup programmes
add一个,名字叫scim, command为 scim
这样就可以每次登陆自动加载scim了,弥补了系统的不足。

至此,已经可以很好的在英文系统中使用SCIM进行中文输入了。

补充,有朋友提到了新的问题,虽然我没有遇到,但是列在这里以备有类似情况的人参考。

我第一次按着你的方法做没有成功,但是加上了http://www.bitscn.com/linux/system_manage/200804/139603.html说的方法,终于让scim里的中文输入出现了--原来是scim出现但左键点它的图标什么都不出来。

From: http://mooninsky.net/chinese-input-method-in-english-locale

对apache中并发控制参数prefork理解和调优

一个apache有linux下的并发不是很高的,大约到3K的样子(其实处理的http的请求可能只有300/s),普通的服务器都会不同程度的出现问 题.apache有关并发控制主要是 prefork和worker二个其中一个来控制.我们可以使用httpd -l来确定当前使用的MPM是prefork.c,还是Worker.c.下面是apache中有关prefork的配置.下面是我优化过的参数.

1. <IfModule prefork.c>
2.
3. #有这个参数就不必像apache1一样修改源码才能修改256客户数的限制,听讲要放到最前面才会生效,2000是这个参数的最大值
4. ServerLimit 2000
5. #指定服务器启动时建立的子进程数量,prefork默认为5。
6. StartServers 25
7.
8. #指定空闲子进程的最小数量,默认为5。如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。
9. MinSpareServers 25
10.
11. #设置空闲子进程的最大数量,默认为10。如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程将杀死多余的子进程。此参数 不要设的太大。如果你将该指令的值设置为比MinSpareServers小,Apache将会自动将其修改 成”MinSpareServers+1″。
12. MaxSpareServers 50
13.
14. #限定同一时间客户端最大接入请求的数量(单个进程并发线程数),默认为256。任何超过MaxClients限制的请求都将进入等候队列,一旦一个链接被释放,队列中的请求将得到服务。要增大这个值,你必须同时增大ServerLimit 。
15. MaxClients 2000
16.
17. #每个子进程在其生存期内允许伺服的最大请求数量,默认为10000.到达MaxRequestsPerChild的限制后,子进程将会结束。如果MaxRequestsPerChild为”0″,子进程将永远不会结束。
18. MaxRequestsPerChild 10000
19.
20. </IfModule>

将MaxRequestsPerChild设置成非零值有两个好处:
1.可以防止(偶然的)内存泄漏无限进行,从而耗尽内存。
2.给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。

工作方式:
一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。Apache总是试图保持一些备用的 (spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生。在Unix系统中,父进程通常以root身 份运行以便邦定80端口,而 Apache产生的子进程通常以一个低特权的用户运行。User和Group指令用于设置子进程的低特权用户。运行子进程的用户必须要对它所服务的内容有 读取的权限,但是对服务内容之外的其他资源必须拥有尽可能少的权限。

对上面的有些值,一定要记的不是越大越好.这个需要经过几次尝试和出错之后才能选好要使用的值(不同的硬件处理水平不一样)。最重要的值是 maxclient允许足够多的工作进程,同时又不会导致服务器进行过度的交换(死机)。如果传入的请求超出处理能力而让服务器当掉的话,那么至少满足此 值的那些请求会得到服务,其他请求被阻塞这样会更加好。

我们调优常常要查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):

1. #ps -ef | grep httpd | wc -l

出现的结果,就是当前Apache能够处理的多少个并发请求,这个值Apache根据负载情况自动调.

查看Apache的并发请求数及其TCP连接状态:

1. #netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

返回结果示例:
LAST_ACK 5
SYN_RECV 30
ESTABLISHED 1597
FIN_WAIT1 51
FIN_WAIT2 504
TIME_WAIT 1057
其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。

状态:描述
CLOSED:无连接是活动的或正在进行
LISTEN:服务器在等待进入呼叫
SYN_RECV:一个连接请求已经到达,等待确认
SYN_SENT:应用已经开始,打开一个连接
ESTABLISHED:正常数据传输状态
FIN_WAIT1:应用说它已经完成
FIN_WAIT2:另一边已同意释放
ITMED_WAIT:等待所有分组死掉
CLOSING:两边同时尝试关闭
TIME_WAIT:另一边已初始化一个释放
LAST_ACK:等待所有分组死掉

可以使用Linux下的webbench来作压力测试.

Apache 2.0性能优化—MPM的选择与配置

Apache 2.0在性能上的改善最吸引人。在支持POSIX线程的Unix系统上,Apache可以通过不同的MPM运行在一种多进程与多线程相混合的模式下,增强 部分配置的可扩充性能。相比于Apache 1.3,2.0版本做了大量的优化来提升处理能力和可伸缩性,并且大多数改进在默认状态下即可生效。但是在编译和运行时刻,2.0也有许多可以显著提高性 能的选择。本文不想叙述那些以功能换取速度的指令,如HostnameLookups等,而只是说明在2.0中影响性能的最核心特性:MPM(Multi -Processing Modules,多道处理模块)的基本工作原理和配置指令。

毫不夸张地说,MPM的引入是Apache 2.0最重要的变化。大家知道,Apache是基于模块化的设计,而Apache 2.0更扩展了模块化设计到Web服务器的最基本功能。服务器装载了一种多道处理模块,负责绑定本机网络端口、接受请求,并调度子进程来处理请求。扩展模 块化设计有两个重要好处:

◆ Apache可以更简洁、有效地支持多种操作系统;

◆ 服务器可以按站点的特殊需要进行自定制。

在用户级,MPM看起来和其它Apache模块非常类似。主要区别是在任意时刻只能有一种MPM被装载到服务器中。

指定MPM的方法

下面以Red Hat Linux 9为平台,说明在Apache 2.0中如何指定MPM (Apache采用2.0.45)。先解压缩源代码包httpd-2.0.45.tar.gz,生成httpd-2.0.45目录(Apache 1.3源代码包的命名规则是apache_1.3.NN.tar.gz,而2.0版则是httpd-2.0.NN.tar.gz,其中NN是次版本号)。

进入httpd-2.0.45目录,运行以下代码:

1. $ ./configure –help|grep mpm

显示如下:

1. –with-mpm=MPM
2. Choose the process model for Apache to use.
3. MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}

上述操作用来选择要使用的进程模型,即哪种MPM模块。Beos、mpmt_os2分别是BeOS和OS/2上缺省的MPM, perchild主要设计目的是以不同的用户和组的身份来运行不同的子进程。这在运行多个需要CGI的虚拟主机时特别有用,会比1.3版中的SuExec 机制做得更好。leader和threadpool都是基于worker的变体,还处于实验性阶段,某些情况下并不会按照预期设想的那样工作,所以 Apache官方也并不推荐使用。因此,我们主要阐述prefork和worker这两种和性能关系最大的产品级MPM ( 有关其它的MPM详细说明,请参见Apache官方文档:http://httpd.apache.org/docs-2.0/mod/)。

prefork的工作原理及配置

如果不用“–with-mpm”显式指定某种MPM,prefork就是Unix平台上缺省的MPM。它所采用的预派生子进程方式也是 Apache 1.3中采用的模式。prefork本身并没有使用到线程,2.0版使用它是为了与1.3版保持兼容性;另一方面,prefork用单独的子进程来处理不 同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。

若使用prefork,在make编译和make install安装后,使用“httpd -l”来确定当前使用的MPM,应该会看到prefork.c(如果看到worker.c说明使用的是worker MPM,依此类推)。再查看缺省生成的httpd.conf配置文件,里面包含如下配置段:

1. <IfModule prefork.c>;
2. StartServers 5
3. MinSpareServers 5
4. MaxSpareServers 10
5. MaxClients 150
6. MaxRequestsPerChild 0
7. </IfModule>

prefork的工作原理是,控制进程在最初建立“StartServers”个子进程后,为了满足MinSpareServers设置的需要创建一个进 程,等待一秒钟,继续创建两个,再等待一秒钟,继续创建四个……如此按指数级增加创建的进程数,最多达到每秒32个,直到满足 MinSpareServers设置的值为止。这就是预派生(prefork)的由来。这种模式可以不必在请求到来时再产生新的进程,从而减小了系统开销 以增加性能。

MaxSpareServers设置了最大的空闲进程数,如果空闲进程数大于这个值,Apache会自动kill掉一些多余进程。这个值不要设得过大,但 如果设的值比MinSpareServers小,Apache会自动把其调整为MinSpareServers+1。如果站点负载较大,可考虑同时加大 MinSpareServers和MaxSpareServers。

MaxRequestsPerChild设置的是每个子进程可处理的请求数。每个子进程在处理了“MaxRequestsPerChild” 个请求后将自动销毁。0意味着无限,即子进程永不销毁。虽然缺省设为0可以使每个子进程处理更多的请求,但如果设成非零值也有两点重要的好处:

◆ 可防止意外的内存泄漏;

◆ 在服务器负载下降的时侯会自动减少子进程数。

因此,可根据服务器的负载来调整这个值。笔者认为10000左右比较合适。

MaxClients是这些指令中最为重要的一个,设定的是Apache可以同时处理的请求,是对Apache性能影响最大的参数。其缺省值 150是远远不够的,如果请求总数已达到这个值(可通过ps -ef|grep http|wc -l来确认),那么后面的请求就要排队,直到某个已处理请求完毕。这就是系统资源还剩下很多而HTTP访问却很慢的主要原因。系统管理员可以根据硬件配置 和负载情况来动态调整这个值。虽然理论上这个值越大,可以处理的请求就越多,但Apache默认的限制不能大于256。如果把这个值设为大于256,那么 Apache将无法起动。事实上,256对于负载稍重的站点也是不够的。在Apache 1.3中,这是个硬限制。如果要加大这个值,必须在“configure”前手工修改的源代码树下的src/include/httpd.h中查找 256,就会发现“#define HARD_SERVER_LIMIT 256”这行。把256改为要增大的值(如4000),然后重新编译Apache即可。在Apache 2.0中新加入了ServerLimit指令,使得无须重编译Apache就可以加大MaxClients。下面是笔者的prefork配置段:

1. <IfModule prefork.c>
2. StartServers 10
3. MinSpareServers 10
4. MaxSpareServers 15
5. ServerLimit 2000
6. MaxClients 1000
7. MaxRequestsPerChild 10000
8. </IfModule>

上述配置中,ServerLimit的最大值是20000,对于大多数站点已经足够。如果一定要再加大这个数值,对位于源代码树下server/mpm/prefork/prefork.c中以下两行做相应修改即可:

1. #define DEFAULT_SERVER_LIMIT 256
2. #define MAX_SERVER_LIMIT 20000

worker的工作原理及配置

相对于prefork,worker是2.0 版中全新的支持多线程和多进程混合模型的MPM。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的服务器。但是, worker也使用了多进程,每个进程又生成多个线程,以获得基于进程服务器的稳定性。这种MPM的工作方式将是Apache 2.0的发展趋势。

在configure -with-mpm=worker后,进行make编译、make install安装。在缺省生成的httpd.conf中有以下配置段:

1. <IfModule worker.c>
2. StartServers 2
3. MaxClients 150
4. MinSpareThreads 25
5. MaxSpareThreads 75
6. ThreadsPerChild 25
7. MaxRequestsPerChild 0
8. </IfModule>

worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild 线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最 多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程总数不能满足负载,控制进程将派生新的子进程。

MinSpareThreads和MaxSpareThreads的最大缺省值分别是75和250。这两个参数对Apache的性能影响并不大,可以按照实际情况相应调节。

ThreadsPerChild是worker MPM中与性能相关最密切的指令。ThreadsPerChild的最大缺省值是64,如果负载较大,64也是不够的。这时要显式使用 ThreadLimit指令,它的最大缺省值是20000。上述两个值位于源码树server/mpm/worker/worker.c中的以下两行:

1. #define DEFAULT_THREAD_LIMIT 64
2. #define MAX_THREAD_LIMIT 20000

这两行对应着ThreadsPerChild和ThreadLimit的限制数。最好在configure之前就把64改成所希望的值。注意,不要把这两个值设得太高,超过系统的处理能力,从而因Apache不起动使系统很不稳定。

Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxClients。如果负载很 大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是 20000)。这两个值位于源码树server/mpm/worker/worker.c中的以下两行:

1. #define DEFAULT_SERVER_LIMIT 16
2. #define MAX_SERVER_LIMIT 20000

需要注意的是,如果显式声明了ServerLimit,那么它乘以ThreadsPerChild的值必须大于等于MaxClients,而且 MaxClients必须是ThreadsPerChild的整数倍,否则Apache将会自动调节到一个相应值(可能是个非期望值)。下面是笔者的 worker配置段:

1. <IfModule worker.c>
2. StartServers 3
3. MaxClients 2000
4. ServerLimit 25
5. MinSpareThreads 50
6. MaxSpareThreads 200
7. ThreadLimit 200
8. ThreadsPerChild 100
9. MaxRequestsPerChild 0
10. </IfModule>

通过上面的叙述,可以了解到Apache 2.0中prefork和worker这两个重要MPM的工作原理,并可根据实际情况来配置Apache相关的核心参数,以获得最大的性能和稳定性。

其它更详细的写以到http://httpd.apache.org/docs-2.0/
合理设置apache httpd的最大连接数

手头有一个网站在线人数增多,访问时很慢。初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种 现象就是说明apache最大连接数已经满了,新的访客只能排队等待有空闲的链接,而如果一旦连接上,在keeyalive 的存活时间内(KeepAliveTimeout,默认5秒)都不用重新打开连接,因此解决的方法就是加大apache的最大连接数。

1.在哪里设置?

服务器的为FreeBSD 6.2 ,apache 2.24,使用默认配置(FreeBSD 默认不加载自定义MPM配置),默认最大连接数是250

在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf

可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:

1. <IfModule mpm_prefork_module>
2.                 StartServers                      5
3.                 MinSpareServers                   5
4.                 MaxSpareServers                  10
5.                 MaxClients                      150
6.                 MaxRequestsPerChild               0
7. </IfModule>

2.要加到多少?

连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。

查看当前的连接数可以用:

1. ps aux | grep httpd | wc -l

或:

1. pgrep httpd|wc -l

计算httpd占用内存的平均数:

1. ps aux|grep -v grep|awk ‘/httpd/{sum+=$6;n++};END{print sum/n}’

由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。

服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368

约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)

控制最大连接数的MaxClients ,因此可以尝试配置为:

1. <IfModule mpm_prefork_module>
2.                 StartServers                      5
3.                 MinSpareServers                   5
4.                 MaxSpareServers                  10
5.                 ServerLimit                    5500
6.                 MaxClients                     5000
7.                 MaxRequestsPerChild               100
8. </IfModule>

注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。

重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访 问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。

(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)

更佳最大值计算的公式:

apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5

参考:

apache的参数设置

Apache 2.0性能优化—MPM的选择与配置

如何避免apache的httpd进程占用比较多的内存

对apache中并发控制参数prefork理解和调优

附:

实时检测HTTPD连接数:

1. watch -n 1 -d “pgrep httpd|wc -l”

来源:http://www.kaiyuanba.cn/html/1/131/226/6098.htm

Java ClassLoader基本原理

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://andynjux.blogbus.com/logs/48220001.html

ClassLoader基本概念

1.ClassLoader分类
类装载器是用来把类(class)装载进JVM的。JVM规范定义了两种类型的类装载器:启动内装载器(bootstrap)和用户自定义装载器(user-defined class loader)

JVM在运行时会产生三个ClassLoader:Bootstrap ClassLoader、Extension ClassLoader和AppClassLoader. Bootstrap是用C++编写的,我们在Java中看不到它,是null,是JVM自带的类装载器,用来装载核心类库,如java.lang.*等。AppClassLoaderParentExtClassLoader,而ExtClassLoaderParentBootstrap ClassLoader
Java提供了抽象类ClassLoader,所有用户自定义类装载器都实例化自ClassLoader的子类。 System Class Loader是一个特殊的用户自定义类装载器,由JVM的实现者提供,在编程者不特别指定装载器的情况下默认装载用户类。系统类装载器可以通过ClassLoader.getSystemClassLoader() 方法得到。

例1,测试你所使用的JVM的ClassLoader

Java代码 复制代码
  1. /*LoaderSample1.java*/
  2. public class LoaderSample1 {
  3. public static void main(String[] args) {
  4. Class c;
  5. ClassLoader cl;
  6. cl  =  ClassLoader.getSystemClassLoader();
  7. System.out.println(cl);
  8. while (cl  !=   null ) {
  9. cl  =  cl.getParent();
  10. System.out.println(cl);
  11. }
  12. try {
  13. c  =  Class.forName( ” java.lang.Object “ );
  14. cl  =  c.getClassLoader();
  15. System.out.println( ” java.lang.Object’s loader is  “ +  cl);
  16. c  =  Class.forName( ” LoaderSample1 “ );
  17. cl  =  c.getClassLoader();
  18. System.out.println( ” LoaderSample1’s loader is  “ +  cl);
  19. }  catch (Exception e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. }

在机器(Sun Java 1.4.2)的运行结果
sun.misc.Launcher$AppClassLoader@1a0c10f
sun.misc.Launcher$ExtClassLoader@e2eec8
null
java.lang.Object’s loader is null
LoaderSample1’s loader is sun.misc.Launcher$AppClassLoader@1a0c10f

第一行表示,系统类装载器实例化自类sun.misc.Launcher$AppClassLoader
第二行表示,系统类装载器的parent实例化自类sun.misc.Launcher$ExtClassLoader
第三行表示,系统类装载器parent的parent为bootstrap
第四行表示,核心类java.lang.Object是由bootstrap装载的
第五行表示,用户类LoaderSample1是由系统类装载器装载的

二.parent delegation模型(双亲委派模型)
从1.2版本开始,Java引入了双亲委托模型,从而更好的保证Java平台的安全。在此模型下,当一个装载器被请求装载某个类时,它首先委托自己的parent去装载,若parent能装载,则返回这个类所对应的Class对象,若parent不能装载,则由parent的请求者去装载

如图1所示,loader2的parent为loader1,loader1的parent为system class loader。假设loader2被要求装载类MyClass,在parent delegation模型下,loader2首先请求loader1代为装载,loader1再请求系统类装载器去装载MyClass。若系统装载器能成 功装载,则将MyClass所对应的Class对象的reference返回给loader1,loader1再将reference返回给 loader2,从而成功将类MyClass装载进虚拟机。若系统类装载器不能装载MyClass,loader1会尝试装载MyClass,若 loader1也不能成功装载,loader2会尝试装载。若所有的parent及loader2本身都不能装载,则装载失败。

若有一个能成功装载,实际装载的类装载器被称为定义类装载器,所有能成功返回Class对象的装载器(包括定义类装载器)被称为初始类装载器。如图1所 示,假设loader1实际装载了MyClass,则loader1为MyClass的定义类装载器,loader2和loader1为MyClass的 初始类装载器。

需要指出的是,Class Loader是对象,它的父子关系和类的父子关系没有任何关系。那么parent delegation模型为什么更安全了?因为在此模型下用户自定义的类装载器不可能装载应该由父亲装载器装载的可靠类,从而防止不可靠甚至恶意的代码代替由父亲装载器装载的可靠代码。实际上,类装载器的编写者可以自由选择不用把请求委托给parent,但正如上所说,会带来安全的问题。

三.命名空间及其作用
每个类装载器有自己的命名空间,命名空间由所有以此装载器为创始类装载器的类组成。不同命名空间的两个类是不可见的,但只要得到类所对应的Class对象的reference,还是可以访问另一命名空间的类。
例2演示了一个命名空间的类如何使用另一命名空间的类。在例子中,LoaderSample2由系统类装载器装载,LoaderSample3由自定义的 装载器loader负责装载,两个类不在同一命名空间,但LoaderSample2得到了LoaderSample3所对应的Class对象的 reference,所以它可以访问LoaderSampl3中公共的成员(如age)。
例2不同命名空间的类的访问

Java代码 复制代码
  1. *LoaderSample2.java*/
  2. import java.net. * ;
  3. import java.lang.reflect. * ;
  4. public class LoaderSample2 {
  5. public static void main(String[] args) {
  6. try {
  7. String path  =  System.getProperty( ” user.dir “ );
  8. URL[] us  =  { new URL( ” file:// “ +  path +   ” /sub/ “ )};
  9. ClassLoader loader  =   new URLClassLoader(us);
  10. Class c  =  loader.loadClass( ” LoaderSample3 “ );
  11. Object o  =  c.newInstance();
  12. Field f  =  c.getField( ” age “ );
  13. int age  =  f.getInt(o);
  14. System.out.println( ” age is  “ +  age);
  15. }  catch (Exception e) {
  16. e.printStackTrace();
  17. }
  18. }
  19. }
Java代码 复制代码
  1. /*sub/Loadersample3.java*/
  2. public class LoaderSample3 {
  3. static {
  4. System.out.println( ” LoaderSample3 loaded “ );
  5. }
  6. public int age  =   30 ;
  7. }

编译:javac LoaderSample2.java; javac sub/LoaderSample3.java
运行:java LoaderSample2
LoaderSample3 loaded
age is 30
从运行结果中可以看出,在类LoaderSample2中可以创建处于另一命名空间的类LoaderSample3中的对象并可以访问其公共成员age。
4. 运行时包(runtime package)
由同一类装载器定义装载的属于相同包的类组成了运行时包,决定两个类是不是属于同一个运行时包,不仅要看它们的包名是否相同,还要看的定义类装载器是否相 同。只有属于同一运行时包的类才能互相访问包可见的类和成员。这样的限制避免了用户自己的代码冒充核心类库的类访问核心类库包可见成员的情况。假设用户自 己定义了一个类java.lang.Yes,并用用户自定义的类装载器装载,由于java.lang.Yes和核心类库java.lang.*由不同的装 载器装载,它们属于不同的运行时包,所以java.lang.Yes不能访问核心类库java.lang中类的包可见的成员。

总结
命名空间并没有完全禁止属于不同空间的类的互相访问,双亲委托模型加强了Java的安全,运行时包增加了对包可见成员的保护。

From: http://andynjux.blogbus.com/logs/48220001.html

HTTP断点续传的原理

其实断点续传的原理很简单,就是在Http的请求上和一般的下载有所不同而已。

打个比方,浏览器请求服务器上的一个文时,所发出的请求如下:
假设服务器域名为wwww.scu.edu.cn,文件名为down.zip。
GET /down.zip HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
excel, application/msword, application/vnd.ms-powerpoint, */*
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
Connection: Keep-Alive

服务器收到请求后,按要求寻找请求的文件,提取文件的信息,然后返回给浏览器,返回信息如下:

200
Content-Length=106786028
Accept-Ranges=bytes
Date=Mon, 30 Apr 2001 12:56:11 GMT
ETag=W/”02ca57e173c11:95b”
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:56:11 GMT

所谓断点续传,也就是要从文件已经下载的地方开始继续下载。所以在客户端浏览器传给
Web服务器的时候要多加一条信息–从哪里开始。
下面是用自己编的一个”浏览器”来传递请求信息给Web服务器,要求从2000070字节开始。
GET /down.zip HTTP/1.0
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2

仔细看一下就会发现多了一行RANGE: bytes=2000070-
这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。
服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/”02ca57e173c11:95b”
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT

和前面服务器返回的信息比较一下,就会发现增加了一行:
Content-Range=bytes 2000070-106786027/106786028
返回的代码也改为206了,而不再是200了。

知道了以上原理,就可以进行断点续传的编程了。

From: http://blog.csdn.net/perddy/archive/2008/03/26/2218676.aspx

gdb常用命令

调用gdb编译需要在cc后面加 -g参数再加-o;

[root@redhat home]#gdb 调试文件:启动gdb

(gdb) l :(字母l)从第一行开始列出源码

(gdb) break n :在第n行处设置断点

(gdb) break func:在函数func()的入口处设置断点

(gdb) info break: 查看断点信息

(gdb) r:运行程序

(gdb) n:单步执行

(gdb) c:继续运行

(gdb) p 变量 :打印变量的值

(gdb) bt:查看函数堆栈

(gdb) finish:退出函数

(gdb) shell 命令行:执行shell命令行

(gdb) set args 参数:指定运行时的参数

(gdb) show args:查看设置好的参数

(gdb) show paths:查看程序运行路径;

set environment varname [=value] 设置环境变量。如:set env USER=hchen;

show environment [varname] 查看环境变量;

(gdb) cd 相当于shell的cd;

(gdb)pwd :显示当前所在目录

(gdb)info program: 来查看程序的是否在运行,进程号,被暂停的原因。

(gdb)clear 行号n:清除第n行的断点

(gdb)delete 断点号n:删除第n个断点

(gdb)disable 断点号n:暂停第n个断点

(gdb)enable 断点号n:开启第n个断点

(gdb)step:单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的

  • list :简记为 l ,其作用就是列出程序的源代码,默认每次显示10行。
  • list 行号:将显示当前文件以“行号”为中心的前后10行代码,如:list 12
  • list 函数名:将显示“函数名”所在函数的源代码,如:list main
  • list :不带参数,将接着上一次 list 命令的,输出下边的内容。
注意 :如果运行list 命令得到类似如下的打印,那是因为在编译程序时没有加入 -g 选项:
(gdb) list
1       ../sysdeps/i386/elf/start.S: No such file or directory.
in ../sysdeps/i386/elf/start.S
  • run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。
  • 回车:重复上一条命令。
  • set args:设置运行程序时的命令行参数,如:set args 33 55
  • show args:显示命令行参数
  • continue:简讯为 c ,其作用是继续运行被断点中断的程序。
  • break:为程序设置断点。
  • break 行号:在当前文件的“行号”处设置断点,如:break  33
  • break 函数名:在用户定义的函数“函数名”处设置断点,如:break cb_button
  • info breakpoints:显示当前程序的断点设置情况
  • disable breakpoints Num:关闭断点“Num”,使其无效,其中“Num”为 info breakpoints 中显示的对应值
  • enable breakpoints Num:打开断点“Num”,使其重新生效
  • step:简记为 s ,单步跟踪程序,当遇到函数调用时,则进入此函数体(一般只进入用户自定义函数)。
  • next:简记为 n,单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。
  • until:当你厌倦了在一个循环体内单步跟踪时,这个命令可以运行程序直到退出循环体。
  • finish: 运行程序,直到当前函数完成返回,并打印函数返回时的堆栈地址和返回值及参数值等信息。
  • stepi或nexti:单步跟踪一些机器指令。
  • print 表达式:简记为 p ,其中“表达式”可以是任何当前正在被测试程序的有效表达式,比如当前正在调试C语言的程序,那么“表达式”可以是任何C语言的有效表达式,包括数字,变量甚至是函数调用。
  • print a:将显示整数 a 的值
  • print ++a:将把 a 中的值加1,并显示出来
  • print name:将显示字符串 name 的值
  • print gdb_test(22):将以整数22作为参数调用 gdb_test() 函数
  • print gdb_test(a):将以变量 a 作为参数调用 gdb_test() 函数
  • bt:显示当前程序的函数调用堆栈。
  • display 表达式:在单步运行时将非常有用,使用display命令设置一个表达式后,它将在每次单步进行指令后,紧接着输出被设置的表达式及值。如: display a
  • watch 表达式:设置一个监视点,一旦被监视的“表达式”的值改变,gdb将强行终止正在被调试的程序。如: watch a
  • kill:将强行终止当前正在调试的程序
  • help 命令:help 命令将显示“命令”的常用帮助信息
  • call 函数(参数):调用“函数”,并传递“参数”,如:call  gdb_test(55)
  • layout:用于分割窗口,可以一边查看代码,一边测试:
  • layout src:显示源代码窗口
  • layout asm:显示反汇编窗口
  • layout regs:显示源代码/反汇编和CPU寄存器窗口
  • layout split:显示源代码和反汇编窗口
  • Ctrl + L:刷新窗口
  • quit:简记为 q ,退出gdb

当然,gdb的功能远不止这些,包括多进程/多线程/信号/远程调试等功能在这里均没有提及,有需要的读者可以参考其它信息。

From: http://blog.csdn.net/gnuhpc/archive/2009/07/21/4368831.aspx

让subversion自动添加Id,Revision等keywords

作者: lostsnow.
http://www.lsproc.com/blog/add_auto_props_in_subversion/

linux下:

vim ~/.subversion/config

windows下

%APPDATA%\Subversion\config

编辑此文件

[auto-props]
*.html = svn:keywords=Id Reversion Date Author
*.php = svn:keywords=Id Reversion Date Author
*.css = svn:keywords=Id Reversion Date Author
*.js = svn:keywords=Id Reversion Date Author

并启用auto-props

[miscellany]
enable-auto-props = yes

这样在 svn add 和 svn import 时就会自动添加keywords

现有的源代码还是没有这个属性,我们得批量的设置一下,一行命令就搞定了(比如我们的目标是当前目录下的所有python源代码文件):

find ./ -type f -name "*.py" | xargs svn propset svn:keywords "Id Reversion Date Author"

– EOF –

Ubuntu Linux 下自动发邮件

1.下面的文章使用了msmtp和nail

2.通过gmail的发邮件

3.只需要将cp Thawte\ Server\ Roots/ThawtePremiumServerCA_b64.txt ThawtePremiumServerCA.crt 稍作修改,找到一个叫Thawte Premium Server CA.pem的文件,
复制成ThawtePremiumServerCA.pem即可。

Ubuntu 命令行发送邮件到远端

我在一部冗余的笔记本电脑(Compaq Presario R3000, 显示屏坏了)上装了Ubuntu+Apache+PHP,平时主要用来调试代码。此外还有一个重要的用途:我在上面运行一些Cron Job, 用来更新网站开发日志的日志分类栏目。虽然每次运行结果都会被存在LOG文件里,但是有时Cron Job运行会出错,为了在第一时间里发现问题,我希望可以通过Email把运行结果发到我常用的邮箱里。

Ubuntu 命令行发送邮件的方法很多,如果Google一下,可以找到象mailx,mutt,nail等邮件客户端。但是安装以后,尝试通过它们放送邮件到 Gmail或者Hotmail,却得到“Mailing to remote domains not supported”的错误信息。认真研究一下,发现问题出在我的Ubuntu缺少完善的邮件服务器(MTA)。可是我的Ubuntu挂在自家的局域网 上,没有固定IP,要搭建一个功能完善的邮件服务器估计不是很容易。(P.S.我在常用的Linux命令集一文里介绍了如何在命令行发送邮件,但是这适合于与安装有邮件服务器的终端,要不然的话,就只可以在本地内发送) 但是我想或许可以通过Gmail在命令行上发送邮件,上网Google了一下,终于找到了一个和我有相同问题的人,不同的是他还提供了详细的解决方案。很简单只需照猫画虎,就可以实现从命令行发送邮件到远端了。原文是英文的,我稍作翻译如下,希望对一些人有所帮助。

1. 安装所需的软件

$ sudo apt-get install msmtp
$ sudo apt-get install nail

2. 安装Gamil的Thawte证书

$ mkdir -p ~/etc/.certs
$ chmod 0700 ~/etc/.certs
$ cd ~/etc/.certs
$ wget https://www.verisign.com/support/thawte-roots.zip --no-check-certificate
$ unzip thawte-roots.zip
$ cp Thawte\ Server\ Roots/ThawtePremiumServerCA_b64.txt ThawtePremiumServerCA.crt

3. 配置msmtp,我是用Vim打开的,原文使用gedit

$ gedit ~/.msmtprc
或者:
$ vim ~/.msmtprc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account,并且把account default改为gmail。 别忘了改“USER”!!!

# config options: http://msmtp.sourceforge.net/doc/msmtp.html#A-user-configuration-file
defaults
logfile /tmp/msmtp.log
# isp account
account isp
auth login
host SMTP.YOURISP.COM
port 25
user YOURNAME@ISP.COM
from YOURNAME@ISP.COM
password *****
# gmail account
account gmail
auth on
host smtp.gmail.com
port 587
user YOURNAME@gmail.com
password *****
from YOURNAME@gmail.com
tls on
tls_trust_file /home/USER/etc/.certs/ThawtePremiumServerCA.crt
# set default account to use (from above)
account default : isp
# 注意:我把默认改为 gmail

4. 更改msmtprc文件的许可

$ chmod 600 ~/.msmtprc

5. 配置nail,我是用Vim打开的,原文使用gedit

$ gedit ~/.mailrc
或者
$ vim ~/.mailrc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account。

# set smtp for nail
# ref: http://ubuntuforums.org/showpost.php...94&postcount=6
# docs: http://msmtp.sourceforge.net/doc/msm...guration-files
# isp account (default)
# $ nail -s "subject line" -a /path/file recipient@email.com < /path/body.txt
set from="YOURNAME@ISP.COM"
set sendmail="/usr/bin/msmtp"
set message-sendmail-extra-arguments="-a isp"
# gmail account
# $ nail -A gmail -s "subject line" -a /path/file recipient@email.com < /path/body.txt
account gmail {
set from="YOURNAME@gmail.com (YOURNAME)"
set sendmail="/usr/bin/msmtp"
set message-sendmail-extra-arguments="-a gmail"
}

搞定!!!

发送测试:

$ echo -e "testing email from the command line" > /tmp/test_email
$ nail -A gmail -s "gmail test" YOURNAME@gmail.com < /tmp/test_email

Log文件在:/tmp/msmtp.log