Tomcat 给我留下了 CLOSE_WAIT 套接字,最终使最大连接数饱和。
我在我的客户端和服务器代码中尝试了很多方法来摆脱这些都无济于事,包括关闭连接、调用 System.gc() 等。
现在我试图找到一种方法来简单地在操作系统中快速超时。我有 conntrack 工作,但不知道如何使用它来终止这些连接。我还将 /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_close_wait 设置为 1,这当然太低了,但连接仍然存在。
有没有办法杀死这些僵尸套接字?
运行 Ubuntu。
我们的服务器因 TCP/IP 会话而过载,我们有 1200 - 1500 个会话。他们中的大多数都挂在 TIME_OUT 状态。事实证明,处于 TIME_OUT 状态的连接会占用一个套接字,直到 60 秒超时。
问题是服务器没有响应,许多客户端没有得到服务。
我做了一个简单的测试:使用 Internet Explorer 8.0 从服务器下载一个 XML 文件 下载在几分之一秒内完成。但是后来我看到 TCP/IP 连接在 TIME_OUT 状态下挂了 60 秒。
有没有办法摆脱 TIME_OUT 等待或减少为新连接释放套接字的时间?
我明白为什么 TCP/IP 连接会进入 TIME_OUT 状态,但我不明白为什么 Internet Explorer 在 XML 文件下载结束后没有关闭连接。
细节。
我们的服务器运行用 Perl (mod-perl) 编写的 Web 服务。该服务向客户提供天气数据。客户端是一个 Flash 应用程序(实际上是嵌入在 Windows 应用程序中的 Flash ActiveX 控件)。
操作系统: Ubuntu
Apache“Keep Alive”选项设置为 0
这似乎与编程有关,但这是一个操作系统问题。
我正在编写一个小型高性能守护进程,每秒需要数千个连接。它在 Linux 上运行良好(特别是 EC2 上的 Ubuntu 9.10)。在 Mac OS X 上,如果我在一个基准测试中抛出几千个连接(大约 16350 个),它只是打开一个连接,做它的事情并关闭连接,然后基准程序挂起几秒钟等待套接字变为可用在继续之前(或在过程中超时)。
我同时使用了 Apache Bench 和 Siege(以确保它不是基准应用程序)。
那么为什么/如何 Mac OS X 限制可以使用套接字的速率,我可以阻止它这样做吗?
还是有其他事情发生?
我知道有一个文件描述符限制,但我没有达到那个限制。接受套接字没有错误,它只是在第一个(大约)16000 之后挂起一段时间,等待 - 我假设 - 操作系统释放套接字。这不应该发生,因为此时所有先前的套接字都已关闭。它们应该以关闭的速度提供,并在 Ubuntu 上提供,但在 Mac OS X 上似乎存在某种多(5-10?)秒的延迟。
我尝试使用 ulimit 进行调整。纳达。
我们正在使用 HAProxy 来平衡我们的 websocket 和 Comet 应用程序。后面有一个 HAProxy 和 3 个应用程序在运行。我们使用 HTTP 基本身份验证(将来我们将使用其他类型的身份验证,如 OAuth)来识别连接的用户。
我们不能使用常规循环,因为给定用户的连接最终在同一台服务器上很重要。在哪里并不重要,但重要的是他们使用相同的服务器。
我知道 HAProxy 是一种基于智能 cookie 的方法,但不幸的是,在我们的例子中,有时,同一用户会从不同的机器连接,所以 cookie 不起作用)。
是否可以使用 HTTP Authorization 标头的散列来进行负载平衡?另外,这更复杂,是否可以定义我们自己的散列方法?
后续问题[在威利的回应之后]:
既然可以做balance hdr(Authorization),是否可以只在登录字段上做(解析后)?
另外,确切的算法是什么?我相信它的形式是hash(Authorization) % number_of_backend_server,但是,散列函数是什么,更重要的是,它是否可以调整?(或者我可以添加一个偏移量)。
我问是因为这个应用程序实际上是保持 XMPP 组件连接打开,我需要使用相同的算法对 XMPP 组件进行负载平衡。toXMPP 节中的jid 由 HTTP 标头授权确定。
有谁知道 Linux 是否支持传出连接上的保持活动套接字选项?
我使用 keep-alive 选项建立了传出连接,但 netstat --timers 显示(我假设计时器已关闭):
tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)
Run Code Online (Sandbox Code Playgroud)
应用了相同套接字选项的传入连接显示:
tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)
Run Code Online (Sandbox Code Playgroud)
我希望我能看到套接字选项,但 ss 或 lsof 都不会显示它们。
在广泛的研究和测试中,写了一个值得 stackexchange 的正确问题,我找到了一个解决方案:libapr1在来宾内部重建包。
我想我还是会发布这些信息,因为它可能对其他人有用。
当我libapache2-mod-php5在 Wheezy 来宾中安装并尝试启动时,我得到以下信息:
root@test01:~# /usr/sbin/apache2ctl start
[crit] (22)Invalid argument: alloc_listener: failed to get a socket for (null)
Syntax error on line 9 of /etc/apache2/ports.conf:
Listen setup failed
Action 'start' failed.
The Apache error log may have more information.
root@test01:~# tail /var/log/apache2/error.log
root@test01:~#
root@test01:~# head -n 9 /etc/apache2/ports.conf|tail -n 1
Listen 80
Run Code Online (Sandbox Code Playgroud)
这是未更改的原始软件包安装,默认情况下无法启动。
根据官方文档,Listen 80其实没问题。把它变成Listen 127.0.0.1:80给我:
[crit] (22)Invalid argument: alloc_listener: failed to get a socket for 127.0.0.1 …Run Code Online (Sandbox Code Playgroud) 在 Apache 2.4 中,您可以使用以下命令将HTTP连接反向代理到本地Unix套接字:[1]
ProxyPass unix:/path/to/app.sock|http://example.com/app/name
Run Code Online (Sandbox Code Playgroud)
您可以使用以下方法将WebSocket连接反向代理到本地TCP套接字:[2]
ProxyPass ws://127.0.0.1:12345/app/name
Run Code Online (Sandbox Code Playgroud)
但是如何将WebSocket连接反向代理到Unix套接字?[?]
现实世界中是否有任何 IPv6 客户端?如果没有,是否还有其他理由支持 IPv6?
(我的理解是,随着 WAN 的出现,这种 IPv6 不是必需的,因此如果有任何适应的话,这种情况非常低。这是正确的,还是在未来几年我们会看到 IPv6 的使用增加?)
在为 WebRTC 使用 Asterisk 挣扎了几个星期之后,我决定把我的问题放在这个论坛上。我的问题如下:
我没有从 WebRTC 到 WebRTC 客户端获取音频。我在局域网环境中工作。
情况 - 使用独立的 Asterisk 服务器从 JSSIP 调用到 JSSIP(相同的客户端)。
问题
从 6001(JSSIP) 拨打 6002(JSSIP) 时根本没有音频。一段时间后,一些 RTP 数据包正在发送,但未收到。在 RTP 数据包出现在日志文件中大约 40 秒后,呼叫被终止,没有任何人为操作。
两个客户端都在同一台计算机上,都在谷歌浏览器上,其中一个在隐身模式下运行。我们还用 2 台不同的笔记本电脑进行了测试,但这给出了相同的结果。
有人知道是什么导致了这个问题吗?我也关注了这个帖子:http : //forums.digium.com/viewtopic.php?f=1&t=90167,但这对我不起作用。您可以在下面找到日志文件和更多信息。
由于关于同一问题的多个帖子,我试图解决这个问题。
星号服务器:
客户:
配置:
配置文件
[general]
rtpstart=10000
rtpend=20000 …Run Code Online (Sandbox Code Playgroud) 我刚刚将 postfix 邮件服务器移到了另一个盒子,但我在让 postfix 通过 unix 套接字与 opendkim 交谈时遇到了麻烦。opendkim 套接字位于/var/run/opendkim/opendkim.sock:
srwxrwxr-x 1 opendkim opendkim 0 Aug 14 15:11 /var/run/opendkim/opendkim.sock=
Run Code Online (Sandbox Code Playgroud)
....但后缀看不到它。这是来自/var/log/mail.log:
Aug 14 15:13:04 new postfix/smtpd[23954]: warning: connect to Milter service unix:/var/run/opendkim/opendkim.sock: No such file or directory
Run Code Online (Sandbox Code Playgroud)
这是我的/etc/postfix/main.cf:
smtpd_milters = inet:127.0.0.1:11444 unix:/var/run/opendkim/opendkim.sock
Run Code Online (Sandbox Code Playgroud)
有没有人对导致问题的原因有任何想法?我已经用谷歌搜索了一下,但找不到任何有效的解决方案。
更新:我正在使用 Postfix 3.1.0-3。这是我的uname -a:
Linux starbeamrainbowlabs.com 3.14.32-xxxx-grs-ipv6-64 #7 SMP Wed Jan 27 18:05:09 CET 2016 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud) socket ×10
apache-2.2 ×1
apache-2.4 ×1
asterisk ×1
audio ×1
connection ×1
debian ×1
email-server ×1
haproxy ×1
http ×1
http-headers ×1
ip ×1
ipv6 ×1
keepalive ×1
linux ×1
mac-osx ×1
networking ×1
opendkim ×1
postfix ×1
proxypass ×1
sip ×1
tcp ×1
tcpip ×1
throttling ×1
web ×1
web-server ×1
websocket ×1