【问题标题】:MOAR process ballooning while running Perl6 socket server运行 Perl6 套接字服务器时 MOAR 进程膨胀
【发布时间】:2019-05-05 09:32:40
【问题描述】:

我有一个使用 IO::Socket::Async 和 Redis::Async 进行消息发布的套接字服务器。每当服务器收到消息时,脚本会翻译该消息并生成确认消息以发送回发送者,以便发送者发送后续消息。由于翻译消息非常昂贵,脚本将在“开始”方法下运行该部分。 但是,我注意到 Moar 进程在脚本运行时占用了我的 RAM。有没有想过我应该在哪里解决这个问题?谢谢!

https://pastebin.com/ySsQsMFH

use v6;
use Data::Dump;
use experimental :pack;
use JSON::Tiny;
use Redis::Async;

constant $SOCKET_PORT = 7000;
constant $SOCKET_ADDR = '0.0.0.0';
constant $REDIS_PORT = 6379;
constant $REDIS_ADDR = '127.0.0.1';
constant $REDIS_AUTH = 'xxxxxxxx';


constant $IDLING_PERIOD_MIN = 180 - 2; # 3 minutes - 2 secs
constant $CACHE_EXPIRE_IN = 86400; # 24h hours

# create socket
my $socket = IO::Socket::Async.listen($SOCKET_ADDR, $SOCKET_PORT);

# connnect to Redis ...
my $redis;
try {
    my $error-code = "110";
    $redis = Redis::Async.new("$SOCKET_ADDR:$SOCKET_PORT");
    $redis.auth($REDIS_AUTH);

    CATCH {
        default {
            say "Error $error-code ", .^name, ': Failed to initiate connection to Redis';
            exit;
        }
    }
}

# react whenever there is connection
react {
    whenever $socket -> $conn {

        # do something when the connection wants to talk
        whenever $conn.Supply(:bin) {
            # only process if data length is either 108 or 116
            if $_.decode('utf-8').chars == 108 or $_.decode('utf-8').chars == 116 {
                say "Received --> "~$_.decode('utf-8');
                my $ack = generateAck($_.decode('utf-8'));  # generate ack based on received data
                if $ack {
                    $conn.print: $ack;
                }else{
                    say "No ack. Received data maybe corrupted. Closing connection";
                    $conn.close;
                }

            }
        }
    }
    CATCH {
        default {
            say .^name, ': ', .Str;
            say "handled in $?LINE";
        }
    }
}

### other subroutines down here ###

【问题讨论】:

  • 我们能看到 generateAck() 函数中的代码吗?我想知道是否在未清理的线程中创建了一些东西。
  • 我注释掉了所有的Redis操作并且内存使用已经稳定。所以我猜是 Redis::Async 模块.. ugh..
  • 请检查 rakudo 2018.11 是否还有这个问题。我在发布之前修复了一些问题,如果在某个时候创建​​了 ThreadPoolScheduler,当程序没有执行任何操作时,内存增长最多可达 2 GB。另外,请尝试将start { loop { Array.new(1, 2, 3) } } 放在某个地方,如果这样可以防止内存膨胀,那么这很可能就是我在说的事情
  • @ZarulZakuan 您收到的错误消息很可能是 rakudo 和 nqp 之间的版本差异,因此可能是其他构建步骤失败,或者 --prefix 不匹配,或者其他不同。不管怎样,现在我祝你好运Inline::Perl5,这是一个非常了不起的模块。
  • @timotimo 非常感谢您的帮助。我真的很感激。现在我认为在 p6 有信誉良好的 redis 模块之前使用 p5 模块更安全。

标签: asynchronous raku io-socket moarvm


【解决方案1】:

问题在于使用 Async::Redis。 Jonathon Stowe 已经修复了 Redis 模块,所以我使用 Redis 模块没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 2018-05-12
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多