NodeJS на ARM занимает 26 секунд для запуска пустого файла

#node.js #linux #arm #embedded

#node.js #linux #arm #встроенный

Вопрос:

Загрузка NodeJS в моей встроенной системе занимает 26 секунд.

У меня есть SOM (system on module) от Microchip. Это архитектура ARM, работающая на частоте 500 МГц и 128 МБ оперативной памяти.

На нем запущен образ BuildRoot Linux с установленным NodeJS.

У меня есть пустой файл с именем «index.js «.

Когда я запускаю «узел времени index.js «, для завершения требуется 26 секунд. Если я отредактирую «index.js » чтобы добавить «console.log(‘hello’);», требуется 26 секунд, прежде чем он распечатает сообщение.

Таким образом, похоже, что NodeJS занимает 26 секунд для загрузки и запуска файла JS.

Я запустил «strace node index.js «. Он вызывает mprotect и cacheflush несколько тысяч раз для большей части замедления:

 13:41:43 cacheflush(0x309228e0, 0x309228ec, 0) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_EXEC) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_WRITE) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_EXEC) = 0
13:41:43 mprotect(0x30902000, 249856, PROT_READ|PROT_WRITE) = 0
 

Похоже, что это очищает кэш команд и данных, помечая раздел памяти как RX, затем в RW, затем обратно в RX, затем, наконец, обратно в RW. Я предполагаю, что он копирует функцию в ОЗУ, изменяет ее, а затем запускает.

Но с использованием «strace -c node index.js » говорит, что на это уходит около 0,5 секунды. Мне нужно найти остальные 25,5 секунды.

Как мне найти остальные 25 секунд?

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

1. Связанные: github.com/nodejs/node/issues/16955

2. Связанные: github.com/nodejs/node/issues/24024

Ответ №1:

Я нашел предварительно скомпилированный пакет по адресу: https://nodejs.org/download/release/latest-v15.x/node-v15.3.0-linux-armv7l.tar.gz

Теперь для выполнения пустого скрипта требуется 1,6 секунды.

Я могу запустить скрипт, который распечатает скомпилированную конфигурацию NodeJS, чтобы выяснить различия с этим: node -e «console.log (process.config);»

Далее нужно выяснить, в чем различия, и включить их в скрипт BuildRoot.

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

1. Вы видели, сколько оперативной памяти он занимает? Есть ли способ уменьшить его с 100 МБ?