2016-02-02 9 views
6

Na platformach 64-bitowych LuaJIT zezwala tylko na 1-2 GB danych (nie licząc obiektów przydzielonych z malloc). Skąd bierze się to ograniczenie i dlaczego jest to jeszcze mniej niż na platformach 32-bitowych?Dlaczego pamięć LuaJIT jest ograniczona do 1-2 GB na platformach 64-bitowych?

+2

można przytoczyć odniesienie do limitu 1 GB?Ze wszystkiego, co widziałem, limit wynosi 2 GB, a czasy, w których inni mówią, że jest to 1 GB na 64-bitowe, albo zostali zwolnieni, albo wątki się zatrzymały. – Taegost

+0

@Taegost To 1 GB na Linuksie. Wyjaśnię – MaxB

Odpowiedz

9

LuaJIT został zaprojektowany do korzystania ze wskaźników 32-bitowych. Na platformach x64 limit pochodzi z użycia flagi mmap i MAP_32BIT.

MAP_32BIT (od Linux 2.4.20, 2,6)

umieścić mapowania w ciągu pierwszych 2 gigabajtów przestrzeń adresową. Ta flaga jest obsługiwana tylko na x86-64 dla programów 64-bitowych. Został dodany, aby umożliwić przydzielanie wątków gdzieś w pierwszych 2 GB pamięci, aby poprawić wydajność przełączania kontekstu na niektórych wczesnych procesorach 64-bitowych.

Zasadniczo użycie tej flagi ogranicza się do pierwszych 31 bitów, a nie do pierwszych 32 bitów zgodnie z nazwą. Zobacz, jak wygląda here, aby uzyskać ładny przegląd limitu 1 GB przy użyciu MAP_32BIT w jądrze Linux.

Nawet jeśli można mieć więcej niż 1GB, autor LuaJIT wyjaśnia, dlaczego byłoby to złe dla wydajności:

  • pełne GC zajmuje 50% więcej czasu niż same alokacji.
  • Jeśli GC jest włączony, podwaja czas przydziału.
  • Aby symulować prawdziwą aplikację, połączenia między obiektami są wybierane losowo w trzecim przebiegu. To podwaja czas GC!

I to było tylko na 1 GB! Teraz wyobraź sobie, że korzystasz z 8 GB - pełny cykl GC pozwoliłby na zajęcie procesora przez 24 sekundy! Dobrze, więc normalnym trybem jest użycie przyrostowej GC. Oznacza to jednak, że obciążenie jest o ~ 30% wyższe, jest ono pomieszane pomiędzy alokacjami i za każdym razem usunie pamięć podręczną procesora. Zasadniczo twoja aplikacja zostanie zdominowana przez obciążenie GC i zaczniesz się zastanawiać, dlaczego jest powolna ...

tl; dr wersja: Nie próbuj tego w domu. A GC potrzebuje przepisania (przełożonego na LuaJIT 2.1).

Podsumowując, limit 1 GB jest ograniczeniem jądra Linux i LuaJIT garbage collector. Dotyczy to tylko obiektów w stanie LuaJIT i można je przezwyciężyć, używając malloc, które zostaną przydzielone poza niższą 32-bitową przestrzenią adresową. Ponadto możliwe jest korzystanie z wersji x86 na komputerze x64 w trybie 32-bitowym i dostęp do pełnego 4 GB.

Sprawdź te linki, aby uzyskać więcej informacji:

Powiązane problemy