今天公司一个网站突然打开特别慢,有时候还会出现打不开的情况,开始怀疑是网络问题,但网络排查没有发现任何异常,最后还是决定在网站服务器内部排查问题
网站用的中间件是apache,监听端口7080,先查看一下7080端口的监听情况
发现出现了大量的TIME_WAIT和CLOSE_WAIT状态下的连接
CLOSE_WAIT
对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭
TIME_WAIT
![](https://i-blog.csdnimg.cn/blog_migrate/36396bf899a7eef0fb576fba2302ec94.png)
不同操作系统上默认的MPM模块 | ||
---|---|---|
操作系统 | MPM模块 | 描述 |
Windows | mpm_winnt | 不用介绍了吧:) |
Unix/Linux | mpm_prefork | 不用介绍了吧:) |
BeOS | mpm_beos | 由Be公司开发的一种多媒体操作系统,官方版已停止更新。 |
Netware | mpm_netware | 由NOVELL公司推出的一种网络操作系统 |
OS/2 | mpmt_os2 | 一种最初由微软和IBM共同开发的操作系统,现由IBM单独开发(微软放弃OS/2,转而开发Windows) |
mpm_winnt
模块是专门针对Windows操作系统而优化设计的MPM模块。它只创建一个单独的子进程,并在这个子进程中轮流产生多个线程来处理请求。
(1)由于apache默认状态下mpm模块的代码是注释的,所以需要先修改apche核心配置
修改为
# Server-pool management (MPM specific)
Include conf/extra/httpd-mpm.conf
(2)修改httpd-mpm.conf
<IfModule mpm_winnt_module>
ThreadsPerChild 150 #推荐设置:小型网站=1000 中型网站=1000~2000 大型网站=2000~3500
MaxRequestsPerChild 0 #推荐设置:小=10000 中或大=20000~100000
<IfModule>
对应的配置参数作用如下:
-
ThreadsPerChild
- 每个子进程的最大并发线程数。 MaxRequestsPerChild
-
每个子进程允许处理的请求总数。如果累计处理的请求数超过该值,该子进程将会结束(然后根据需要确定是否创建新的子进程),该值设为0表示不限制请求总数(子进程永不结束)。
该参数建议设为非零的值,可以带来以下两个好处:
-
- 可以防止程序中可能存在的内存泄漏无限进行下去,从而耗尽内存。
- 给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量。
-
注意:在以上涉及到统计请求数量的参数中,对于KeepAlive的连接,只有第一个请求会被计数。