2016-12-02 2 views
0

Мне нужно иметь тысячи изолятов внутри V8. Но я столкнулся с странной проблемой с памятью, когда у меня есть некоторое количество свободной памяти, но v8 выдает сообщения об ошибках OOM.Сколько изолятов v8 можно создать?

Например,

enter image description here

В данном конкретном случае, вы можете увидеть у нас еще есть некоторый RAM когда V8 выдает эту ошибку. Номер 2047 - номер итератора. Таким образом, в основном код выглядит так:

for(int i = 0; i < 3000; i++) { 
    std::cout << i << std::endl; 
    new Isolate(params); 
} 

Возможно, мне нужно увеличить ограничение размера стека. Я уже установил 16Mb. И все еще есть эта проблема. htop показывает только 4 потока для этого процесса. Поэтому я не думаю, что проблема с потоками.

Внутри класса v8 я

this->_maxRAMAvailable = 8; // 8Gb in my case 
    int maxOldSpaceMb = this->_maxRAMAvailable * 1024; 
    int maxSemiSpaceMb = 512; 
    int maxExecutableSizeMb = 512; 

    v8::V8::InitializeICUDefaultLocation(argv[0]); 
    v8::V8::InitializeExternalStartupData(argv[0]); 
    this->_platform = v8::platform::CreateDefaultPlatform(); 
    this->_create_params.array_buffer_allocator = 
    v8::ArrayBuffer::Allocator::NewDefaultAllocator(); 

    const uint64_t physical_memory = this->_maxRAMAvailable * 1024 * 1024 * 1024; 
    const uint64_t virtual_memory_limit = 0; 
    this->_create_params.constraints.ConfigureDefaults(physical_memory, virtual_memory_limit); 

    this->_create_params.constraints.set_max_old_space_size(maxOldSpaceMb); 
    this->_create_params.constraints.set_max_semi_space_size(maxSemiSpaceMb); 

это -> _ create_params.constraints.set_max_executable_size (maxExecutableSizeMb);

v8::V8::InitializePlatform(this->_platform); 
    v8::V8::Initialize(); 

Большое спасибо!

+3

Боюсь, что мы не можем угадать ваш код. И ваши намерения. – Ven

+0

Imaging Я просто делаю auto isolate = v8 :: Isolate :: New (this -> _ create_params); в петле. И это не удается, даже если у меня 20% памяти. Зачем ? –

ответ

0

Информация ограничена здесь, но давайте вспомним, что каждый изолят требует свой собственный поток, (вероятно, другой поток для GC?)

Так 1723 изолятов будет означать ~ 3400 темы ...

Для каждого потока потребуется (нормальное значение по умолчанию) 1 МБ стека.

Так что это 3.4 ГБ памяти, выделенной прямо там.

+0

Imaging Я просто делаю auto isolate = v8 :: Isolate :: New (this -> _ create_params); в петле. И это не удается, даже если у меня 20% памяти. Зачем ? –

+0

@EduardBondarenko, каков счетчик потоков в точке аварии? (запустите его в отладчике) –

+0

, так что вы говорите ... V8 действительно должен использовать Erlang, где «потоки» очень легкие? – thecoshman

0

эхо 600000>/Proc/сист/VM/max_map_count

работает для меня.

0

Каждый изолированный V8 резервирует большой блок адресного пространства, поэтому, как только вы создали некоторое количество изолятов, дальнейшие попытки могут потерпеть неудачу из-за исчерпания адресного пространства, а не фактического использования памяти.

В 32-разрядном процессе вы можете создавать только 50-100 изолятов до того, как большинство ОС запустит запросы резервирования V8. У 64-битного V8, очевидно, гораздо больше адресного пространства для работы, но он также резервирует гораздо большие блоки.

Кроме того, нет смысла создавать тысячи изолятов, если вы не собираетесь одновременно запускать тысячи сценариев, для чего потребуются тысячи потоков. Я предлагаю использовать надежный пул потоков, чтобы запланировать ваши сценарии и создавать изоляты V8 на потоке по требованию.

+0

У нас есть тысяча изолятов с предварительно скомпилированным кодом. И используйте threadpool для запуска кода одновременно. Спасибо. –

Смежные вопросы