工作中遇到的apache问题

血的代价换来的对apache性能的理解:
简单来说,这次遇到两个问题:
1 mpm工作模式:目前最流行的模式是perfork(非线程)模式和worker(线程)模式
因为线程自身的问题,自然perfork比worker模式要安全,并且在简单的情况下具有更快的速度(减少了线程的开销),但是对于繁忙的应用,worker模式由于具有更低的内存消耗,所以能支撑更多的请求。
编译:
--with-mpm=work
httpd.conf:
<IfModule worker.c>
StartServers         32
MaxClients             6400
ServerLimit        100
MinSpareThreads    256
MaxSpareThreads       1024
ThreadsPerChild     64
MaxRequestsPerChild  100000
</IfModule>
这样,就限制了最多允许同时处理6400个请求,根据模块的不同,这个极限值还可以增加
而当使用perfork的时候,必须要修改apache的源码才能修改上限值
如果不做限制,apache会不停增加进程数,直至耗尽系统资源为止

2 一个自定义的module,原先是在32位下编译并运行的,由于32位解释long int的极限是32位,不满足需求,因此代码里用了long long int型。相当的打印为"%lld",
现换在64位机器上重新编译时,由于64位机器,编译long int 为64位,因此改为"%ld"即可。但是问题来了:
如果编译apache mod采用apxs来编译,则必须改为"%ld",如果继续采用"%lld",则如下代码:
unsigned char * idstr = apr_psprintf(r->pool,"%lld",id);
结果是:%ld
而不是id的真实值
如果采用gcc来编译,是不会有这个问题的,估计是apxs的一个bug
版本:apache2.2.9

这个bug....

猜你喜欢

转载自koven2049.iteye.com/blog/465691