2016-02-02 13 views
6

Su piattaforme a 64 bit, LuaJIT consente solo fino a 1-2 GB di dati (senza contare gli oggetti allocati con malloc). Da dove viene questa limitazione, e perché è ancora meno rispetto alle piattaforme a 32 bit?Perché la memoria di LuaJIT è limitata a 1-2 GB su piattaforme a 64 bit?

+2

Può citare un riferimento per il limite di 1 GB?Da tutto quello che ho visto, il limite è 2GB e le volte in cui altri hanno detto che è 1GB per 64-bit o sono stati ignorati o i thread si sono fermati lì – Taegost

+0

@Taegost È 1GB su Linux. Chiarirò – MaxB

risposta

9

LuaJIT è progettato per utilizzare puntatori a 32 bit. Sulle piattaforme x64 il limite deriva dall'uso di mmap e dal flag MAP_32BIT.

MAP_32BIT (a partire da Linux 2.4.20, 2.6):

Mettere la mappatura nei primi 2 gigabyte di spazio di indirizzi del processo. Questo flag è supportato solo su x86-64, per programmi a 64 bit. È stato aggiunto per consentire l'allocazione degli stack di thread da qualche parte nei primi 2 GB di memoria, in modo da migliorare le prestazioni di commutazione di contesto su alcuni dei primi processori a 64 bit.

Essenzialmente utilizzando questo limite di flag per i primi 31 bit, non i primi 32 bit come suggerisce il nome. Dai un'occhiata a here per una bella panoramica del limite di 1 GB usando MAP_32BIT nel kernel di Linux.

Anche se si potrebbe avere più di 1 GB, l'autore LuaJIT spiega perché questo sarebbe un male per le prestazioni:

  • Un GC completa richiede 50% in più di tempo di quanto gli stanziamenti stessi.
  • Se il GC è abilitato, raddoppia il tempo di allocazione.
  • Per simulare un'applicazione reale, i collegamenti tra gli oggetti sono randomizzati nella terza esecuzione. Questo raddoppia il tempo di GC!

E questo era solo per 1 GB! Ora immagina di usare 8 GB: un ciclo GC completo manterrà la CPU occupata per ben 24 secondi! Ok, quindi la modalità normale è usare il GC incrementale. Ma questo significa solo che il sovraccarico è ~ 30% più alto, è misto tra le allocazioni e sfrutta la cache della CPU ogni volta. Fondamentalmente la tua applicazione sarà dominata dal sovraccarico del GC e comincerai a chiedermi perché è lento ....

tl; versione dr: Non provarlo a casa. E il GC ha bisogno di una riscrittura (posticipata a LuaJIT 2.1).

Per riassumere, il limite di 1 GB è una limitazione del kernel Linux e del garbage collector LuaJIT. Questo si applica solo agli oggetti all'interno dello stato di LuaJIT e può essere superato utilizzando malloc, che verrà allocata al di fuori dello spazio degli indirizzi inferiore a 32 bit. Inoltre, è possibile utilizzare il build su x64 in modalità a 32 bit e accedere a tutti i 4 GB.

Guarda anche questi link per ulteriori informazioni:

Problemi correlati