Wie Speicherverbrauch von C ++ - Programm mit Copy-on-Write zu minimieren?

8

Ich arbeite an einer Anwendung, die sich bis zu achtmal für Parallelität ausgibt. Jede Verzweigung hat eine vollständige Kopie des Speicherplatzes des ursprünglichen Prozesses zum Zeitpunkt der Verzweigung. Die Forks sind schnell, da Linux die Seiten zwischen den Prozessen teilt und nur neue erstellt, wenn sie geändert werden. Das Wachstum des Speicherverbrauchs scheint in der Praxis ungefähr 3x für meine Anwendung zu betragen. Irgendwelche Vorschläge für Tools oder Techniken zur Identifizierung von Änderungen, die dieses Wachstum verringern?

Ein Gedanke ist, die Seitenfragmentierung der modifizierten Seiten zu betrachten. Es gibt auch nur die Brute-Force-Untersuchung dessen, was in den verzweigten Prozessen zugeordnet ist. Welche Techniken oder Werkzeuge können Sie in jedem Fall zur Durchführung dieser Analyse empfehlen?

Beachten Sie, dass das Programm selbst bei Parallelität mehrere Stunden benötigt und einen Speicherbedarf von bis zu 1 TB hat, daher sind die Optionen für die Instrumentierung begrenzt.

    
dromodel 28.11.2012, 15:07
quelle

1 Antwort

2

Sie können vmstat , systemtap und oder glibc s malloc-hooks um den Verbrauch zu überwachen. Sie können perf verwenden, um zu sehen, wo Fehler auftreten, um die tatsächlichen Auswirkungen des Verbrauchs zu verstehen.

Wenn Ihre Anwendung bei der Verwendung großer Speicherpools TLB-Druck ausübt (z. B. wenn Sie eine sehr große Datenmenge streamen), können Sie große / große Seiten verwenden, um den Aufwand für 4k Seiten zu verringern.

Sie können auch madvise verwenden, um dem Kernel innerhalb Ihrer Prozesse mitzuteilen, was Sie wahrscheinlich mit dem zugewiesenen Speicher tun werden.

    
Brian Cain 28.11.2012 15:14
quelle