【发布时间】:2017-05-05 15:46:31
【问题描述】:
我有一个小型 UDP perl 服务,它接收 syslog 数据,对其进行处理,然后将其按原路(通过 UDP)发送回也在 localhost 上运行的 syslog 服务器。它工作得非常好,但我担心它可能会丢失 syslog 事件,所以对其进行了测试
基本上我推送了 100 条“这是一个测试 $NUM++”消息,有时会出现 100 条 - 但一旦出现 99 条(由运行 perl 脚本的主机上运行的 tcpdump 测量)。这是在我们的生产系统上,它处理 500-1500 syslog msg/sec。像往常一样,当它只有测试流量时它工作得很好,但在负载下我不确定。
tcpdump 显示通过 eth0 传入的 100 个事件,但 tcpdump 显示通过 lo 传出的 99 个事件。因此,也许有人从未进入“$rcvSock”,或者有人通过“$sndSock”迷路了
perl 代码基本上如下所示。但是,“#fiddling”位确实涉及 DNS 查找的一些暂停,因此有一些“读取->块->写入”正在进行。我认为 UDP 不支持“侦听”,所以我无法确定 perl 脚本在“摆弄”时是否阻止并丢弃下一个接收?
谁能阐明损失可能发生在哪里以及如何克服损失?
$rcvSock = IO::Socket::INET->new(
LocalAddr => $hn,
LocalPort => $rcvPort,
Timeout => $timeout,
Proto => 'udp'
);
$sndSock = IO::Socket::INET->new(
PeerAddr => $syslogSrv,
PeerPort =>$syslogPort,
Timeout => $timeout,
Proto => 'udp',
Blocking => 0
);
while (1) {
$now=time;
$rcvSock->recv($input,2560);
$remote_addr=$rcvSock->peerhost();
#fiddling occurs
$sndSock->send("$input");
}
【问题讨论】:
-
这与 Perl 无关,但 UDP 是一个简单的不可靠协议。 What are the chances of losing a UDP packet? 的可能重复项
-
确实 UDP 是一个不可靠的协议。但如果速度变慢,可能是 Perl 应用程序的问题