浏览 4644 次
锁定老帖子 主题:如何知道哪些请求在等待
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-09-22
当tomcat服务器面临大用户量的访问时,用shell 命令:netstat -ant查看,会有大量的SYN_RECV的链接,应该是正在等待的链接。 查tomcat access log ,文件里只有已经成功完成响应的url, 里面也给出了request的响应时间。但不知道正在等待的请求有哪些? 我的问题是,我不只是想知道有多少请求在等的,我还想知道正在等待的请求的url是什么?有什么办法或什么shell命令可以知道? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-09-24
tomcat一般检测不到这样的状态,SYN_RECV一般也不好检测到。如你现在看到较多的SYN_RECV,这是没有完成三次握手,服务端等待client发ACK确定最终建立连接。如有大量的SYN_RECV可以考虑是不是遭到DDOS攻击
|
|
返回顶楼 | |
发表时间:2012-09-26
Thanks xiaoZ5919.
SYN_RECV不是很多,每次就20个左右,tomcat响应就很慢,几乎停止服务。这种情况已经多次发生,现在都是一天多重启tomcat一次,才可以正常服务。 20个SYN_RECV应该不会是网络攻击吧,我想如果是网络攻击,应该有上百个吧。 我尝试调整tomcat最大线程数到800,服务器性能如内存,i/o都非常好了,但还是一天多时间就发生一次问题。 每次出现不能访问的问题时,内存、cpu使用率都比较低,数据库连接也不多。我感觉应该是问题出在tomcat这里。大家有什么建议?谢谢! |
|
返回顶楼 | |
发表时间:2012-09-26
线程数不是越大越好,你用的nio模式还是bio模式。如有大量的SYN_RECV应该调整backlog。tomcat下这个参数通过acceptCount来调整
|
|
返回顶楼 | |
发表时间:2012-09-26
Hi,xiaoZ5919,
SYN_RECV不是大量的,一般在tamcat无法访问时,也就20个左右。 我的tomcat配置是:acceptCount=1000. 关键是在tomcat没有响应时,cpu,内存使用率比较低,也就30%以下。网站http端口连接不超过250个(但tomcat最大线程配置为800),似乎tamcat在阻塞许多请求。所以,十分奇怪。一方面是网站访问无响应,另一方面,服务端http端口没有太多的连接,也就250以下。 我们都曾经怀疑linux的配置有什么问题。为了扩大linux tcp连接能力,我们修改参数:net.ipv4.tcp_max_syn_backlog = 2048。 但还是无法解决问题。 |
|
返回顶楼 | |
发表时间:2012-09-26
嗯backlog的含义 在linux2.2以后发生了变化,按说acceptcount为1000 net.ipv4.tcp_max_syn_backlog = 2048按说已经能支持很高的并发了
那就只能检测jstack 看看tomcat在做什么?或者看看GC的情况 加我QQ吧 论坛讨论太麻烦了 |
|
返回顶楼 | |
发表时间:2012-11-20
xiaoZ5919 写道 嗯backlog的含义 在linux2.2以后发生了变化,按说acceptcount为1000 net.ipv4.tcp_max_syn_backlog = 2048按说已经能支持很高的并发了
那就只能检测jstack 看看tomcat在做什么?或者看看GC的情况 加我QQ吧 论坛讨论太麻烦了 这个问题最终怎么解决的呢? |
|
返回顶楼 | |
发表时间:2012-11-20
又看了一遍帖子,楼主是说tomcat先停止响应在前,然后才出现的tcp连接有20多个处于SYN_RECV状态。
如果是这样的话,我想是不是你的tomcat进程已经内存溢出在先,已经不工作了。或者你的tomcat的GC时间过长?再或者tomcat线程有死锁? 建议楼主看看日志,tomcat是否有OOM。如果没有,建议用jprofile检测是否存在死锁。如果还看不出结果,建议使用jstack查看一下停止响应时候的tomcat工作线程状态。 最后,希望楼主结贴时给出一些解决方案的分享,谢谢~~ |
|
返回顶楼 | |
发表时间:2012-12-03
可以使用jstack -l <pid> 输出jvm线程栈的全部信息,看一下线程都wait到什么地方了,再酌情做优化
|
|
返回顶楼 | |