Раздувание процесса MOAR во время работы сервера сокетов Perl6

У меня есть сервер сокетов, использующий IO::Socket::Async и Redis::Async для публикации сообщений. Всякий раз, когда сервер получает сообщение, сценарий переводит сообщение и генерирует подтверждающее сообщение для отправки обратно отправителю, чтобы отправитель отправлял последующие сообщения. Поскольку перевод сообщения довольно дорогой, сценарий запускает эту часть с помощью метода start. Тем не менее, я заметил, что процесс Moar пожирает мою оперативную память во время работы скрипта. Любая мысль, где я должен искать, чтобы решить эту проблему? Спасибо!

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 ###

1 ответ

Проблема заключалась в использовании Async::Redis. Джонатон Стоу исправил модуль Redis, поэтому я использую модуль Redis без проблем.

Другие вопросы по тегам