apache perfork模式下的http进程监控

今天做了个实验,看看apache下http进程是如何工作的,

首先大家需要明白http分为长连接和短连接,在http1.1中提出长连接的概念,

apache里面默认是长连接,


Timeout 300
KeepAlive on
MaxKeepAliveRequests 100
KeepAliveTimeout 30
<IfModule prefork.c>
StartServers         4
MinSpareServers      4
MaxSpareServers      4
MaxClients           4
MaxRequestsPerChild  0
</IfModule>

其中我将apache最大的进程数设置为4,ps -ef | grep http大家可以看到是4个http进程

KeepAlive off

首先是短连接,短连接的意思是每次请求都需要建立accept请求以及请求结束close请求,

通过strace -T -p 24485(其中一个http进程pid)

跟踪查看确实如此,其中我的页面里面放入了10个img图片,可以看到每个图片请求头尾都有accept与close,

如果你跟踪4个http进程,会发现这10个图片会分摊在这4个进程中,顺序就是页面从头到下图片请求顺序,当然开始4个请求会分摊在4个进程中,剩下的就看执行的时间了,谁执行完谁就进行下一个请求的处理,

因为不是持久连接,在浏览器端修改连接数没有作用,所以下一步我们看持久连接,

默认浏览器和apache都是具有持久连接的,

其中我们设置了
KeepAliveTimeout 30,并且我们通过火狐将

# about:config
network.http.max-persistent-connections-per-server: 2

这样的话持久连接为2,当我们访问页面的时候,跟踪4个http进程会发现apache中的http只会占用其中的2个进程,

并且头部会有一个accept建立连接过程,中间的图片请求不会再出现accept,最后poll([{fd=9, events=POLLIN}], 1, 30000) = 0 <29.996957>看到时间是29秒也就是我们设置的30秒,后该连接断开close,

在连接请求期间,该ip下对该网址的访问apache会分配在占用的这2个http进程,然后请求完毕后继续等待(poll)30秒,如果还有其它请求将继续占用该http进程但不会重新启用新的http进程除非http进程已经关闭,并且是apache进行分配,这样的话如果你占用的http多,每个http进程都会留下你的足迹,至少会保持30秒钟,这样的话会造成别人访问该网址的堵塞,所以network.http.max-persistent-connections-per-server尽量不要太高,

我们可以继续测试,如果在上面ip请求期间,你用别的用户访问,apache会分配到剩下的http进程中,如果上面的请求network.http.max-persistent-connections-per-server    : 4,将所有的http进程全部占用,那你的这次请求只会等待,我们可以清楚的发现在上面的poll([{fd=9, events=POLLIN}], 1, 30000) = 0 <29.996957>30秒后悔重新建立accept,来执行请求。这三十秒期间,其它客户机必须等待,在30秒之内,你个人可以浏览网站畅通无阻。

 

说这些是为了让大家结合课本中的概念有清除的认识,

然后我们需要配置下apache server_status,

./configure --prefix=/usr/local/apache -enable-so --enable-modules=all --enable-mods-shared=all

增加此编译,然后打开http.conf注释 server-status与server_info以及ExtendedStatus On的注释,

通过http://192.168.135.3:8080/server-status?refresh=600就可以看到apache监控状态,我们可以清楚看到每个请求具体分配到哪个http进程,以及每个进程的状态,还有更多详细的数据可以查看

 

这两天又研究了下lighttpd,同样也可以通过server-status来观察请求情况就不和apache做对比了

lighttpd是单进程模式,在我们向服务器未发送请求时

epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999856>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999850>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999852>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999854>
epoll_wait(5, {}, 10241, 1000)          = 0 <1.000854>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>

每一秒轮询一次,通过函数调用的1000也正是这个参数的含义,

而在lighttpd中keeplive的设置是server.max-keep-alive-idle     = 5,也就是5秒钟后关闭连接

我们可以印证这一点请求一次后我们观察进程执行情况

epoll_wait(5, {}, 10241, 1000)          = 0 <0.999644>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999850>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999855>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999851>
epoll_wait(5, {}, 10241, 1000)          = 0 <0.999854>
shutdown(8, 1 /* send */)               = 0 <0.000084>
epoll_ctl(5, EPOLL_CTL_DEL, 8, {0, {u32=0, u64=0}}) = 0 <0.000068>
close(8)   

在经过5次epoll_wait后也就是5秒后关闭连接

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值