不幸的是,在我们的服务器上发生了一系列ddos攻击后,我们不得不转移到使用KeepAlive。 我运行一个网页游戏,因此网页通常很小,大部分都是文本,所以KeepAliveclosures很多年。 除了能够更好地处理ddos攻击之外,事情似乎没有什么不同(服务器能够更好地处理ddos攻击),服务器负载保持在相当低的水平,平均约为0.50,内存使用率约为10%(总共24GB)。
但是一天一次,Apache只会挂起而不会响应大约15分钟。 即使在一整天,有时页面需要5秒钟加载,我注意到在Apache状态记分牌上唯一的东西是保持活动(读取)请求,没有等待连接,阅读答复,closures连接等,大约100多个读取请求。 然后它自行排列。 在这种情况下,它似乎是随机的,尽pipe通常在一天中的繁忙时间内,服务器负载和内存都不高,而且apache没有足够的可用请求时隙。
我的configuration更改如下:
ServerLimit 1024 MaxClients 1024 Timeout 2 KeepAliveTimeout 5 KeepAlive On MaxKeepAliveRequests 100 MinSpareServers 100 MaxSpareServers 200
我希望有人对此有所了解,或者可以build议我可以检查哪些日志/进程,以了解发生这种情况的原因。
提前致谢。
编辑:Incase这有助于…
56 requests/sec - 116.2 kB/second - 2126 B/request 105 requests currently being processed, 154 idle workers
今天晚些时候,我希望有一倍。
编辑2:KeepAliveTimeout从5更改为2
编辑3:它再次发生。 这次我正要看到它。 Apache没有反应,并没有占用任何内存。 从127.0.0.1有250个连接,从来没有发生。 Apache重新启动后,一切都很好。 很奇怪!
几件事你可以做或检查:
- 我们有一个类似的问题,Apache 1.3没有正确地closures连接,使得它们永远留存下来,最终将填满所有的客户端插槽。 为了解决这个问题,我们只需每天在cron脚本中重新启动一次Apache。 你的问题听起来不同,因为你提到它最终清理,所以每天重新启动可能无济于事。
- 我假设你永远不会到达并发连接中的“MaxClients”?
- 什么是您的“KeepAliveTimeout”设置? 默认值是15秒,对于大多数1到2秒的网站来说,这个值通常比较好(特别是因为你的“超时”设置为2)。
- 从一个客户端检查“netstat -an”是否有DOS的明显迹象。 我经常发现,当网站存在非显而易见的问题时,一个客户会以20次/秒的速度连续敲击网站。 检查以确保您没有限制服务器的带宽(如果只有10 Mbps的连接,这很容易)。 我使用我的提供商的在线带宽监视图,但也应该有命令行方式来做到这一点(ifconfig可能会让你)。 有各种Apache或服务器级别的解决scheme来自动防止DOS攻击(不pipe是否无辜)。
- 在问题期间检查“top”并查看CPU,IO和内存使用情况。 确保你没有交换内存(如果你只有10%的内存使用,你不应该这样做)。
- 说到内存……甚至24GB RAM服务器的10%的内存使用率似乎也很低。 我有几个服务器与1-4GB的内存,他们都在75-90%的内存使用率(但大部分是在操作系统caching中)。 我想这将取决于你的Apache的设置和服务器的使用情况。
- 确保应用程序层中没有导致问题的其他死锁(如数据库)。 例如,检查您的Apache“服务器状态”页面,如果加载速度很快,但是您的常规站点页面加载速度较慢,那么问题可能不是Apache服务器。
- 检查“/ var / log”中的日志,特别是Apache错误日志和相关消息的“消息”日志。 如果您没有启用这些或其他应用程序日志,请至less暂时启用它们。
- 检查系统的限制,比如每次允许打开文件的数量(ulimit -n)。 许多服务器/操作系统的默认设置不一定为高容量服务器configuration。
- 如果一切都不成功,就挑战你关于什么问题的假设,并仔细检查“不能”失败或者你已经检查过的项目。