Почему память 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.

проверьте эти ссылки для получения дополнительной информации: