[英]Memory leak (?) using IO::Socket::Async (on FreeBSD 13.1)
在 raku (v2022.07) 应用程序中处理 stream 的日志(通过 UDP)时,我使用 IO::Socket::Async 遇到了似乎是 memory 的泄漏。
我将代码提取到下面包含的一个更简单的程序中(~ 与https://docs.raku.org/type/IO::Socket::Async中的代码相同):
#!/usr/bin/env raku
#
my $socket = IO::Socket::Async.bind-udp('localhost', 24225);
react {
whenever $socket.Supply -> $v {
print $v if $v.chars > 0;
};
};
它泄漏了大量的 ram - 我让它运行了大约 12 个小时,当我检查时 - 仍在运行(在 1T ram 机器上) - 使用 ps auwwx [pid]
它显示 314974456 和 20739784 用于 VSZ 和 RSS(因此,大约 300G v 大小和 20G 驻留)。
[顺便说一句,UDP 流量相当小——平均 350(~100 字节)数据包/秒(峰值到~1000/秒)]
所以.. 我在 perl5 中重写了上面的内容(在带有几个 raku 变体的类似泄漏结果之后)它迅速稳定在大约 8M 驻留 - 这很好/稳定/等等。 - 但我更喜欢这个过程来提供一个 raku 频道(没有单独的 perl 过程/文件拖尾等)。
我的环境:FreeBSD 13.1-RELEASE-p2 GENERIC amd64 和 raku:v2022.07 建立在 MoarVM 2022.07 上(与 rakubrew 一起安装)。
我猜这是 freebsd 上的 raku 独有的,但不确定。
我确实尝试将 (rakubrew) 升级到 v2022.12 以查看问题是否在那里解决 - 但在重建模块 (zef) 时,失败太多(Digest/Digest::HMAC 的一些问题) - 所以我不得不恢复到 2022.07。
对于解决泄漏的任何建议或解决从 UDP 端口读取的替代方法,我一定会感激不尽。
不完全是您问题的解决方案,但您可以使用内置功能从 Raku 代码中监控 memory 的使用情况:
use Telemetry;
say T{"max-rss"};
还要记住 Supply 默认解码 unicode 个字符。 如果您的协议是二进制的,您可以将:bin
添加到 Socket 参数以避免将二进制数据视为文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.