Почему память LuaJIT ограничена 1-2 ГБ на 64-битных платформах?
на 64-битных платформах LuaJIT позволяет только до 1-2GB данных (не считая объектов, выделенных с malloc
). Откуда взялось это ограничение и почему оно еще меньше, чем на 32-битных платформах?
1 ответов
LuaJIT предназначен для использования 32-битных указателей. On x64
платформы ограничение происходит от использования вызов mmap и MAP_32BIT
флаг.
MAP_32BIT (начиная с Linux 2.4.20, 2.6):
поместите отображение в первые 2 гигабайта адресного пространства процесса. Этот флаг поддерживается только на x86-64, для 64-битных программ. Он был добавлен, чтобы позволить стекам потоков выделяться где-то в первых 2 ГБ памяти, чтобы улучшить контекстный переключатель производительность на некоторых ранних 64-битных процессоров.
по существу, используя этот флаг, ограничивает первые 31 бит, а не первые 32 бита, как следует из названия. Посмотрите здесь для хорошего обзора предела 1GB с помощью MAP_32BIT
в ядре Linux.
даже если у вас может быть более 1 ГБ, автор LuaJIT объясняет, почему это было бы плохо для производительности:
- полный GC занимает на 50% больше времени, чем распределения сами себя.
- если GC включен, он удваивает время выделения.
- чтобы имитировать реальное приложение, связи между объектами рандомизируются в третьем запуске. Это удваивает время GC!
и это было только для 1GB! Теперь представьте себе использование 8GB - полный цикл GC будет держать процессор занят в течение колоссальных 24 секунд! Хорошо, поэтому нормальный режим-использовать инкрементный GC. Но это просто означает, что накладные расходы ~30% выше, смешано между распределения, и он будет выселять кэш CPU каждый раз. В основном в вашем приложении будут преобладать накладные расходы GC, и вы начнете задаваться вопросом, почему это медленно ....
tl; dr версия: не пытайтесь это дома. И GC нуждается в переписывании (отложено до LuaJIT 2.1).
подводя итог, ограничение 1GB является ограничением ядра Linux и сборщика мусора LuaJIT. Это относится только к объектам в состоянии LuaJIT и может быть преодолено с помощью malloc
, который будет выделять вне Нижнего 32-битного адресного пространства. Кроме того, можно использовать x86
построить x64
в 32-битном режиме и имеют доступ к полному 4GB.
проверьте эти ссылки для получения дополнительной информации: