2011-06-27 9 views
11

Jestem programistą pracującym nad bardzo dużą, intensywnie wykorzystującą pamięć aplikacją 32-bitową. Wyjście z wirtualnej przestrzeni adresowej (pamięci) jest dla nas problemem. Podczas mojego badania ostatnich problemów zauważyłem dużą porcję pamięci, która jest zarezerwowana przez IOKit (512 MB). Ta pamięć nie jest przydzielona, ​​ale tylko zarezerwowana. Dalsze badania wykazały, że większość aplikacji (Safari, iTunes itp.) Również rezerwuje ten fragment pamięci. Wygląda na to, że pozostaje nieprzydzielony. Używam vmmap do testowania. Na przykład, tutaj jest to aplikacja kakao wykonane z Xcode, przy użyciu domyślnego szablonu:Jak zmniejszyć ilość rezerw IOKit w pamięci podczas uruchamiania procesu?

REGION TYPE      VIRTUAL 
===========      ======= 
CG backing stores     1008K 
CG image        4K 
CG raster data      64K 
CG shared images     2252K 
Carbon        7264K 
CoreGraphics       16K 
IOKit (reserved)     512.0M  reserved VM address space (unallocated) 
MALLOC        59.0M  see MALLOC ZONE table below 
MALLOC guard page     48K 
MALLOC metadata      348K 
Memory tag=242      12K 
STACK GUARD      56.0M 
Stack        8712K 
VM_ALLOCATE      16.2M 
__DATA        8296K 
__IMAGE       1240K 
__LINKEDIT       31.5M 
__TEXT        76.7M 
__UNICODE       536K 
mapped file      27.4M 
shared memory      1320K 
===========      ======= 
TOTAL        809.2M 
TOTAL, minus reserved VM space 297.2M 

Czy mogę coś zrobić, aby zmniejszyć lub wyeliminować tę pulę pamięci? Nasza aplikacja naprawdę mogłaby wykorzystać to 512 MB !!!

EDYCJA: Zrobiłem więcej badań i wydaje się, że ta porcja pamięci to ramka bufora karty graficznej zamapowana w przestrzeń użytkownika. Sądzę więc, że dokładniejsze pytanie brzmi, czy istnieje limit bufora ramki, który przejmuje tak dużą część wirtualnej przestrzeni adresowej w trybie użytkownika?

EDYCJA: Przeprowadzono dalsze testy i stwierdzono, że kluczem do zmiany jest IOFBMemorySize. Jak pokazano, jeśli zrobić tego polecenia:

ioreg -l | grep IOFBMemorySize 

Albo można zobaczyć go w IORegistryExplorer. Nie udało mi się jednak zmienić tej wartości. Próbowałem dodać go do Info.plist dla ATIFramebuffer.kext, no good. Próbowałem napisać program, który wywołuje IOConnectSetCFProperty, ale zwrócił kIOReturnUnsupported.

EDYCJA: Po dalszych badaniach wydaje się, że klucz IOFBMemorySize jest prawdopodobnie tylko do odczytu, po prostu raportując ilość pamięci dostępnej na karcie graficznej. Wydawało się, że w pliku Configuration.plist dla CoreGraphics znajdują się interesujące wartości, ale żaden z nich nie miał wpływu na przydzielanie pamięci (nawet po ponownym uruchomieniu komputera).

Odpowiedz

2

Myślę, że patrzysz na to w niewłaściwy sposób.

A) IOKit nie pobiera 512 MB pamięci dla bufora ramki.

B) stwierdza w tabeli, że wysłano tę wiadomość reserved VM address space (unallocated), tak że prawdopodobnie jest to pamięć dysku mapowana jako wirtualna przestrzeń pamięci.

C) jeśli brakuje wolnej pamięci w uruchomionej aplikacji, należy ją inaczej ułożyć, sprawdzić alokacje i wycieki, a w razie potrzeby wykonać buforowanie i leniwe pobieranie.

+0

a), to jest chwytając 512 MB wirtualnej przestrzeni adresowej, która jest oparta na rozmiarze bufora ramki. B) tak, wirtualna przestrzeń adresowa. Z czego 32-bitowa aplikacja ma 4 gb. C) Naprawdę nie odpowiada na pytanie. – pj4533

+0

Nie ma znaczenia, ile adresów jest dostępnych, ważne, ile pamięci jest dostępne, tylko dlatego, że można policzyć do liczby nie oznacza, że ​​masz tyle bitów. –

+0

Ummmm .... nie jestem pewien, czy rozumiem, co mówisz, ale absolutnie ma znaczenie ile adresów jest dostępnych (32bit vs 64bit). Faktem jest, że 32-bitowe zadania mają (w przybliżeniu) 4 GB wirtualnej przestrzeni adresowej. Po zastosowaniu alokacja pamięci kończy się niepowodzeniem. IOKit rezerwuje 512 MB wirtualnej przestrzeni adresowej dla framebuffera karty graficznej, i chcę wiedzieć, jak obniżyć to do mniejszej ilości. – pj4533

0

co prawda nie jest to odpowiedź na twoje pytanie, ale sugestia, w jaki sposób, aby kontynuować ...

piszesz, że pracujesz na bardzo dużych aplikacji 32-bitowych, więc może teraz jest czas, aby ponownie przemyśl swoją architekturę wykonywalną i oddziel bardzo dużą aplikację na wiele procesów. może chcesz spakować kod 32-bitowy (QT?) w jedną aplikację (czy to proces w tle lub GUI sterowany ...), a następnie umieścić więcej intensywnych pamięci i bitów zorientowanych na przetwarzanie w aplikacji drugorzędnej (64-bitowej?). istnieje wiele smaków komunikacji między procesami do wyboru, a Twoja aplikacja może potencjalnie korzystać z bardziej równoległej architektury.

tylko pomysł ... powodzenia!

| K <

+0

dzięki .... i tak, 64-bit to długoterminowe rozwiązanie tego problemu. Niestety, musimy obsługiwać 32-bitowy oddział naszej aplikacji od dłuższego czasu ze względu na potrzeby klienta. – pj4533

+0

Zastanawiam się również, czy istnieje sposób na przydzielenie pamięci niskiego poziomu poza proc. Zastępując malloc moją własną implementacją, która wykorzystała IPC do uzyskania "pamięci" z innego (64-bitowego) procesu. Wydawało się jednak, że jest to ciąg dalszy (nie wspominając o trudnym wdrożeniu w dużej bazie kodu). – pj4533

0

a. Czy próbowałeś uruchomić to na słabszej karcie graficznej? Więc może zostanie przydzielone tylko 128fb? Ustawienia sprzętowe karty graficznej?

b. Użyj wstrzyknięcia kodu, aby anulować alokacji pamięci ...

Zakładając to Twoja prywatna aplikacja, która robi użyć framebuff, etc, etc
To oczywiście nie jest pojedyncza zmiana linii, ale można zmienić kod przeznaczyć mniejsze buforu lub nie alokację lub umożliwić przydział, a następnie uwolnienie go (i odwrócić podczas zamykania programu), itd itp

i postawić można tego dokonać w sposób stabilny

+0

Ponieważ każda aplikacja OSX wykazuje takie zachowanie, próbowałem sprawdzać procesy na innych komputerach, uruchamiając różne karty graficzne. Tak, ilość zarezerwowanej pamięci jest inna. (jest zarezerwowany, ale nie przydzielony pozornie). Szukałem ustawień sprzętowych, wykopałem REAL w głąb ustawień, ale nie znalazłem niczego, co można by ustawić przez użytkownika. Po rozmowie z Apple o tym problemie wydaje się, że jest on całkowicie kontrolowany przez sterownik wideo. Mógłbym podejść do połączenia, jak przypuszczam, ale Apple odradzał to (oczywiście). – pj4533

+0

OK ... to jest naprawdę ekstremalne ... ale brzmisz na wpół – YAZR