Почему мой Discord.js боту требуется более пяти минут, чтобы ответить на сервере с менее чем 500 пользователями?

#node.js #discord.js

Вопрос:

Я только что разработал бота для добавления ролей пользователю, который начинает потоковую передачу на моем сервере. Когда я протестировал бота на изолированном сервере с несколькими каналами и пользователями, бот отреагировал мгновенно. Но теперь я настроил своего бота на своем основном сервере Discord примерно с 25 каналами и около ~500 пользователями, и теперь время отклика составляет более пяти минут, прежде чем я увижу, что он добавляет или удаляет роль.

Я подключаюсь через гигабит FIOS и работаю на I9 с оперативной памятью DDR4 4266 МГц.

Когда я впервые запускаю сервер узлов, я замечаю, что задержка намного меньше, однако все еще очень медленные ответы примерно на минуту или две, прежде чем он добавит или удалит роли. Если я позволю серверу работать в течение десяти минут, то время отклика составит около пяти минут, прежде чем он добавит роль. Я не знаю, продолжает ли это ухудшаться с течением времени. Но что может быть причиной этой задержки? Я сразу вижу, как мой статус пользователя меняется на потоковый (фиолетовая точка) в списке онлайн-пользователей, но мой бот discord не знает об этом в течение очень долгого времени!

Это мой код, я изо всех сил старался его оптимизировать, но я только учился Discord.js уже около недели, и я все еще очень незнаком с этим:

 // require the discord.js module
const Discord = require('discord.js');

// create a new Discord client
const client = new Discord.Client();

let role = '';

client.once('ready', () => {
    const myGuild = client.guilds.cache.get('123456789123456789');
    role = myGuild.roles.cache.find(role => role.name === 'streaming');

    console.log('Ready!');
});

client.on("presenceUpdate", (oldPresence, newPresence) => {
    
    if (!newPresence.activities){ return false; }
    
    newPresence.activities.forEach(activity => {
        if (activity.type == "STREAMING") {
            //console.log(`${newPresence.user.tag} is streaming at ${activity.url}.`);
            newPresence.member.roles.add(role)
        } else {
            newPresence.member.roles.remove(role)
        };
    });
    
});

// login to Discord with your app's token
client.login('123456789123456789.123456789.123456789123456789');
 

Может кто-нибудь, пожалуйста, объяснить, почему мой бот становится таким вялым? Это почти непригодно для использования и немного обескураживает.

Ответ №1:

Значение maxListeners по умолчанию равно 10, и, возможно, стоит изучить возможность установки этого значения выше.

Кроме того, мне любопытно, есть ли утечка памяти в вашем приложении. Это похоже на это из-за вялости, которая ощущается с течением времени.

Попробуйте использовать инструмент профилирования, например Clinic.js для мониторинга состояния приложения с течением времени.

Комментарии:

1. Я протестировал Clinic и увидел, что загрузка памяти продолжает расти бесконечно, что помогло мне в дальнейшем диагностировать причину утечки памяти. Кроме того, я увеличил количество максимальных списков, как вы рекомендуете, и я верю, что это тоже немного помогло. Мой бот теперь прекрасно работает! Большое спасибо!