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?
Odpowiedz
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:
- 1. Dlaczego liczba jednoczesnych pobrań jest ograniczona?
- 2. Pozostań na ruchomych platformach
- 3. Dlaczego wewnętrzna klasa Meta modelu Django jest ograniczona?
- 4. Przetwarzanie na dużych bitmapach (do 3 GB)
- 5. Czy liczba zadań jest ograniczona?
- 6. Enchant słownika na różnych platformach
- 7. Moja pamięć podręczna jest spłukiwana, dlaczego?
- 8. Dlaczego valgrind jest ograniczony do 32 Gb na architekturach 64-bitowych?
- 9. Czy struktura zagnieżdżona DataFrame Spark jest ograniczona do selekcji?
- 10. Dlaczego zagnieżdżona pamięć wycieków na zawsze?
- 11. Użycie wskaźników pustych przestrzeni na różnych platformach
- 12. Ograniczona rodzina zamkniętych typów
- 13. Dlaczego kowariancja/kontrawariancja C# 4.0 jest ograniczona do sparametryzowanego interfejsu i typów delegowanych?
- 14. Jaki jest obecny stan obsługi "thread_local" na platformach?
- 15. linkedin javascript api domena jest ograniczona do localhost
- 16. Najłatwiejszy zestaw narzędzi do wyświetlania na wielu platformach?
- 17. Proste API TCP/IP na różnych platformach?
- 18. Program Qt wdrożyć na wielu platformach, jak?
- 19. Dodaj wydarzenie do kalendarza z poziomu przeglądarki na platformach mobilnych
- 20. precyzja SQL zmiennoprzecinkowa ograniczona do 6 cyfr
- 21. SparkError: Całkowita wielkość odcinkach wyników zadań XXXX (2,0 GB) jest większy niż spark.driver.maxResultSize (2,0 GB)
- 22. Ograniczona optymalizacja w R
- 23. Zastąpić każdy} znacznikiem} \ n ogromnym (12 GB), który składa się z 1 linii?
- 24. Konsekwentne liczby pseudolosowe na różnych platformach
- 25. Instalacja Haskell na Ubuntu 12
- 26. Ograniczona lista heterogeniczna
- 27. Ograniczona kartezjańska kalkulacja produktu - PHP
- 28. Dlaczego nie przydzielona pamięć jest oznaczona jako 0xCC?
- 29. Czy LuaJIT obsługuje __gc dla tabel?
- 30. Dlaczego fragmentacja pamięci jest problemem na 64-bitowym komputerze?
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
@Taegost To 1 GB na Linuksie. Wyjaśnię – MaxB