在 raku (v2022.07) 应用程序中处理日志流(通过 UDP)时,我使用 IO::Socket::Async 遇到了内存泄漏问题。
我将代码提取到一个更简单的程序中,如下所示(〜与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;
};
};
Run Code Online (Sandbox Code Playgroud)
它泄漏了大量的内存 - 我让它运行大约 12 小时,当我检查时 - 仍在运行(在 1T 内存机器上) - 使用 ps auwwx [pid]
它显示 VSZ 和 RSS 为 314974456 和 20739784(因此,v 大小大约为 300G,驻留数量为 20G)。
[顺便说一句,UDP 流量相当轻 - 平均每秒 350 个(约 100 字节)数据包(峰值达到约 1000 个/秒)]
所以..我在perl5中重写了上面的内容(在类似的泄漏结果和几个raku变体之后),它很快稳定在大约8M驻留-这很好/稳定/等等。- 但我更喜欢这个进程来提供 raku 通道(没有单独的 perl 进程/文件尾部等)。
我的环境:FreeBSD 13.1-RELEASE-p2 GENERIC amd64 和 raku:v2022.07 …
我正在 Raku 中重写一些 perl/图表软件,但通过 Inline::Perl5 使用 ChartDirector perl5 模块(下面的链接)遇到了问题。该模块基本上是 DLL 的 Perl 接口;通过 Inline::Perl5 使用模块似乎适用于代码中显式包含的方法调用 - 但大多数方法调用是通过 perl5 中的自动加载“捕获所有”机制执行的。这些在我的 raku 代码中不起作用。
我的问题是我可以期望这种应用程序使用 Inline::Perl5 工作吗?(也许没有办法“捕获”这些自动加载的方法调用),如果是这样,如何做到这一点。
感谢您的任何指点、建议。
工作组
ChartDirector 软件(优秀的图形/图表软件 - 已经使用 Perl 近 20 年了): https: //www.advsofteng.com/index.html
引用有关此内容的 Chartdir 论坛线程开头的措辞(简化的)、版本信息和代码:
我正在使用
Inline::Perl5它,它可以与我尝试过的所有其他模块一起使用。我在复制Chartdir 站点上的“第一个项目”示例时遇到问题。
使用chartdir 6、freebsd 12.2(intel平台)、raku 2022.04、perl 5.32.1。
#!/usr/bin/env raku
use lib:from<Perl5> '/usr/local/lib/perl5/site_perl';
use Inline::Perl5;
my $p5 = Inline::Perl5.new;
$p5.use('perlchartdir') ;
my $data = [85, 156, 179.5, 211, 123];
my $labels = ["Mon", "Tue", "Wed", "Thu", "Fri"]; …Run Code Online (Sandbox Code Playgroud)