Ответ 1
В соответствии с этим ответом, который вы, возможно, уже видели, есть строка, которая гласит:
Обратите внимание, что страница "share-able" считается приватным сопоставлением, пока она фактически разделяется. т.е. если в настоящее время используется только один процесс libfoo, этот раздел текста библиотеки появится в процессе частные сопоставления. Он будет учитываться в общих сопоставлениях (и удаляется из частных) только в том случае, если/при запуске другого процесса используя эту библиотеку.
Что я сделал бы, чтобы проверить, получаете ли вы преимущества описанные в этой статье, помещается файл размером 10 МБ в качестве литерала строка непосредственно в исходный код. Затем, если вы запустите 20 рабочих, вы сможете узнать, используете ли вы 200 МБ памяти или всего 10 МБ, как ожидается, с новой функцией сбора мусора.
UPDATE:
Я просмотрел источник единорога и нашел ссылку на эта замечательная статья.
Подводя итог, в нем говорится, что для того, чтобы адаптировать ваши приложения, чтобы воспользоваться преимуществами коллективного сборщика мусора Ruby Enterprise Edition, вы должны установить GC.copy_on_write_friendly в true, прежде чем вы откроете fork.
if GC.respond_to?(:copy_on_write_friendly=)
GC.copy_on_write_friendly = true
end
На основе вашего предоставленного конфигурационного файла единорога, похоже, отсутствует назначение.
Кроме того, мне понравилось читать эти связанные статьи:
- http://merbist.com/2011/02/22/concurrency-in-ruby-explained/
- http://linux.die.net/man/2/fork
- http://linux.die.net/man/2/clone
В соответствии с страницей fork man:
В Linux, fork() реализуется с использованием страниц копирования на запись, поэтому только штраф, который он несет, - это время и память, необходимые для дублировать таблицы родительских страниц и создавать уникальную задачу структура для ребенка.
Начиная с версии 2.3.3, вместо того, чтобы ссылаться на ядро fork() вызов, оболочка glibc fork(), которая предоставляется как часть NPTL реализация threading вызывает clone (2) с флагами, которые обеспечивают тот же эффект, что и традиционный системный вызов. (Вызов fork() - эквивалентно вызову клона (2), определяющему флаги только как SIGCHLD.) Оболочка glibc вызывает любые обработчики вил, которые были установлены используя pthread_atfork (3).
И в соответствии с страницей клонирования:
В отличие от fork (2), эти вызовы позволяют дочернему процессу совместно использовать части его контекст выполнения с вызывающим процессом, таким как память пространство, таблицу файловых дескрипторов и таблицу сигналов обработчики.
Итак, я читаю это, чтобы означать: linux fork copy-on-write, которая является функцией, которую единорог полагается на реализацию совместного использования памяти, не была реализована до libc 2.2.3 (пожалуйста, кто-то меня исправит, если я В этой интерпретации неверно.
Чтобы проверить, какая версия libc вы используете, вы можете ввести:
ldd --version
Или найдите glibc и запустите его напрямую. В моей системе он нашел файл в следующем месте:
locate libc.so
/lib/x86_64-linux-gnu/libc.so.6