<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>datenkobold.de &#187; Speicheroptimierung</title>
	<atom:link href="http://www.datenkobold.de/weblog/tags/speicheroptimierung/feed" rel="self" type="application/rss+xml" />
	<link>http://www.datenkobold.de/weblog</link>
	<description>das Weblog von Steffen Bauch</description>
	<lastBuildDate>Fri, 09 Dec 2011 21:58:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Speicherverbrauch unter Linux messen</title>
		<link>http://www.datenkobold.de/weblog/2010/01/speicherverbrauch-unter-linux-messen</link>
		<comments>http://www.datenkobold.de/weblog/2010/01/speicherverbrauch-unter-linux-messen#comments</comments>
		<pubDate>Wed, 06 Jan 2010 00:03:33 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[smem]]></category>
		<category><![CDATA[Speicheroptimierung]]></category>
		<category><![CDATA[Speicherverbrauch]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=583</guid>
		<description><![CDATA[Bei der Entwicklung oder Leistungsbewertung von Software ist die Bestimmung des Speicherverbrauchs eines Prozesses eine h&#228;ufige Aufgabe. Durch die Nutzung von dynamisch geladenen Bibliotheken und die gemeinsame Nutzung von Speicherseiten durch mehrere Prozesse ist die genaue Bestimmung der verbrauchten Ressourcen eine Frage der Z&#228;hlweise. Bei der Verwendung von bekannten Linux-Werkzeugen wie ps, htop oder top [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/03/chemnitzer-linux-tage-2005' rel='bookmark' title='Chemnitzer Linux-Tage 2005'>Chemnitzer Linux-Tage 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/chemitzer-linux-tage-2007' rel='bookmark' title='Chemitzer Linux-Tage 2007'>Chemitzer Linux-Tage 2007</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Bei der Entwicklung oder Leistungsbewertung von Software ist die Bestimmung des Speicherverbrauchs eines Prozesses eine h&#228;ufige Aufgabe. Durch die Nutzung von dynamisch geladenen Bibliotheken und die gemeinsame Nutzung von Speicherseiten durch mehrere Prozesse ist die genaue Bestimmung der verbrauchten Ressourcen eine Frage der Z&#228;hlweise. Bei der Verwendung von bekannten Linux-Werkzeugen wie <code>ps</code>, <code>htop</code> oder <code>top</code> wird zumeist die Gesamtmenge aller durch einen Prozess verbrauchten virtuellen Speicherseiten gez&#228;hlt. Die Bestimmung ist unabh&#228;ngig davon, ob die zu Grunde liegenden physikalischen Speicherbereiche eventuell durch mehrere Prozesse gleichzeitig genutzt werden. Die gemessene Speichermenge wird dabei als Resident Set Size (RSS) bezeichnet. Durch die mehrfache Z&#228;hlung wird die Auslegung der Speicherausstattung einer Maschine erschwert.</p>
<p>Das von Matt Mackall geschriebene Programm <a href="http://www.selenic.com/smem/">smem</a> ist ein Werkzeug, das verschiedene Berichte &#252;ber die Speichernutzung auf einem Linux-System erstellen kann. Im Gegensatz zu den bereits genannten Werkzeugen kann <code>smem</code> die Proportional Set Size (PSS) bestimmen. Die PSS ist eine weitere Messgr&#246;&#223;e f&#252;r den Speicherverbrauch eines Programms, bei welcher die durch Bibliotheken genutzte Speichermenge gleichm&#228;&#223;ig auf die nutzenden Applikationen aufgeteilt wird. Wird eine Bibliothek durch drei Programme genutzt, wird jeweils nur ein Drittel des durch die Bibliothek verbrauchten Speichers f&#252;r die PSS der nutzenden Programme einkalkuliert. Neben der Bestimmung der PSS ist zus&#228;tzlich die Bestimmung der Unique Set Size (USS) m&#246;glich. Die USS eines Prozesses ist die Speichermenge, die nur durch diesen Prozess genutzt wird. Wird der entsprechende Prozess entfernt, wird auf dem System diese Speichermenge frei.<br />
<img src="http://www.datenkobold.de/weblog/wp-content/uploads/2010/01/smem-by-pss-small.png" alt="smem-by-pss-small" title="smem-by-pss-small" width="450" height="383" class="aligncenter size-full wp-image-586" /><br />
<code>smem</code> ist in Python geschrieben und ben&#246;tigt mindestens Version 2.6.27 des Linux-Kernels, da erst dieser die notwendige Datei <code>pagemap</code> mit der Zuordnung von virtuellem zu physikalischem Speicher f&#252;r jeden Prozess in <code>/proc</code> enth&#228;lt. Neben der Auflistung von RSS, PSS, USS und verbrauchtem Swap-Speicher f&#252;r Prozesse und Nutzer mit verschiedenen Filterkriterien beherrscht smem auch die Ausgabe von Torten- und Balkengrafiken als PNG, SVG, JPG und EPS. Das Programm ist allerdings im Moment noch nicht in allen Distributionen enthalten.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2005/03/chemnitzer-linux-tage-2005' rel='bookmark' title='Chemnitzer Linux-Tage 2005'>Chemnitzer Linux-Tage 2005</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/the-code-linux' rel='bookmark' title='The Code Linux'>The Code Linux</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/03/chemitzer-linux-tage-2007' rel='bookmark' title='Chemitzer Linux-Tage 2007'>Chemitzer Linux-Tage 2007</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2010/01/speicherverbrauch-unter-linux-messen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Speicheroptimierung mit pahole</title>
		<link>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole</link>
		<comments>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole#comments</comments>
		<pubDate>Tue, 22 Dec 2009 09:05:03 +0000</pubDate>
		<dc:creator>aquo</dc:creator>
				<category><![CDATA[Programmierung]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[pahole]]></category>
		<category><![CDATA[Speicheroptimierung]]></category>

		<guid isPermaLink="false">http://www.datenkobold.de/weblog/?p=517</guid>
		<description><![CDATA[Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt. Werden bei der Programmierung in C zusammengesetzten Datentypen wie struct [...]


<strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Bei der Nutzung der Programmiersprache C ist der Softwareentwickler neben den g&#228;ngigen Optimierungen durch den Compiler zum Gro&#223;teil selbst f&#252;r die Optimierung des Laufzeitverhaltens eines Programms und des Speicherbedarfs der Datenstrukturen zust&#228;ndig. Im folgenden Artikel wird zur Unterst&#252;tzung bei der Speicheroptimierung das Linux-Tool pahole vorgestellt.</p>
<p>Werden bei der Programmierung in C zusammengesetzten Datentypen wie <code>struct</code> verwendet ist es m&#246;glich, dass aus Gr&#252;nden des Alignments zwischen den Teilelementen der Struktur nicht genutzte F&#252;llbytes eingef&#252;gt werden. Zur&#252;ckzuf&#252;hren ist das Einf&#252;gen dieser F&#252;llbytes auf die Rechnerarchitektur und die Art und Weise wie ein Prozessor auf den Hauptspeicher zugreift. Wenn ein Prozessor Daten aus dem Hauptspeicher liest, dann erfolgt der Zugriff mit der Verarbeitungsbreite des Prozessors. Ist der Prozessor ein 32-bit Prozessor, dann werden in einem Schritt 4 Byte gelesen. Diese Annahme gilt f&#252;r alle weiteren Beispiele.</p>
<p>Ein Datenelement ist dann richtig im Speicher angeordnet, wenn seine Speicheradresse einem ganzzahligen Vielfachen seiner Gr&#246;&#223;e entspricht. F&#252;r diesen Fall kann der Prozessor das Datenelement optimal einlesen (ohne &#220;berlappung und notwendige Verschiebung) und das Datenelement wird als aligned bezeichnet. Werden nun Elemente mit unterschiedlichen Speichergr&#246;&#223;en wie unsigned short (2 Byte), unsigned char (1 Byte) oder unsigned int (4 Byte) in einem Verbunddatentyp gemischt verwendet ist es m&#246;glich, dass F&#252;llbytes eingef&#252;gt werden um das Alignment zu gew&#228;hrleisten.</p>
<p>Zur weiteren Erkl&#228;rung soll nun folgende Datenstruktur betrachtet werden:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">short</span> alpha<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> beta<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> gamma<span style="color: #339933;">;</span>
        <span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span> delta<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>In dieser Datenstruktur wird zwischen den Elementen beta und gamma ein F&#252;llbyte eingef&#252;gt um gamma entsprechend den Alignment-Anforderungen auszurichten. Das F&#252;llbyte ist notwendig, da alpha und beta zusammen 3 Byte, also beispielhaft die Adressen 0 bis 2 belegenen und gamma als Datentyp mit 4 Byte Speicherbedarf auf Adresse 4 ausgerichtet wird. Die Adresse 3 bleibt dann ungenutzt und geht als verf&#252;gbarer Speicher verloren. Diese L&#246;cher in den Strukturen sind nicht optimal und k&#246;nnen teilweise durch Umordnen der Elemente entfernt werden. Das manuelle Berechnen dieser L&#246;cher ist zwar m&#246;glich, durch geeignete Werkzeuge allerdings auch automatisierbar.</p>
<p>Das Linux-Werkzeug pahole (Poke-a-Hole) ist ein Hilfsmittel um Datenstrukturen zu analysieren, Alignement-L&#246;cher zu identifizieren und Umordnungsvorschl&#228;ge anzugeben. Ziel ist die Reduzierung von Strukturgr&#246;&#223;en im Speicher und dadurch die Reduzierung des Speicherbedarfs von Programmen w&#228;hrend der Laufzeit. Ein wichtiger Effekt ist au&#223;erdem die bessere Ausnutzung von Caches und dadurch eine Beschleunigung des Programms bei Speicheroperationen. Durch die Entfernung der F&#252;llbytes entsteht eine geringere Belastung des Speicherbusses.</p>
<p>Da pahole kein Tool zur statischen Quellcodeanalyse ist, sondern den mit Debug-Informationen ausgestatteten Object-Code untersucht, sind neben dem Build-Werkzeug <code>cmake</code> zum Kompilieren noch weitere Bibliotheken zur Unterst&#252;tzung des DWARF2-Debug-Formates notwendig. Die Installation erfolgt unter Ubuntu mit:</p>
<pre>
sudo aptitude install libdw-dev libelf-dev cmake
</pre>
<p>Der Programmcode von pahole ist aufgrund des Ursprungs in der Linux-Kernel-Entwicklergemeinde im Kernel-Git-Repository verf&#252;gbar, man erh&#228;lt den Quellcode mit folgendem Befehl:</p>
<pre>
git clone git://git.kernel.org/pub/scm/linux/kernel/git/acme/pahole.git
</pre>
<p>Unter Ubuntu 9.10 Karmic Koala ist unter Umst&#228;nden wie in diesem <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=534529">Bugreport</a> beschrieben vor dem Kompilieren noch ein Patch notwendig. Dabei ist der <code>find_library</code> Ausdruck f&#252;r <code>EBL_LIBRARY</code> in <code>cmake/modules/FindDWARF.cmake</code> durch <code>set (EBL_LIBRARY -ldw)</code> zu ersetzen.</p>
<p>Das Kompilieren und die Installation erfolgt dann im Verzeichnis pahole mit den Befehlen:</p>
<pre>
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make
sudo make install
</pre>
<p>Das zu untersuchende Programm <code>hello</code> oder Object-File <code>hello.o</code> ist dann mit dem Compiler im Debug-Modus, also <code>gcc -g</code> zu kompilieren. Der Befehl</p>
<pre>
pahole hello
</pre>
<p>beziehungsweise</p>
<pre>
pahole hello.o
</pre>
<p>gibt dann einen Bericht in folgender Art f&#252;r alle verwendeten, nicht-anonymen Strukturen aus:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> test_data <span style="color: #009900;">&#123;</span>
	<span style="color: #993333;">short</span> <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>         alpha<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     0     2 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              beta<span style="color: #339933;">;</span>         <span style="color: #808080; font-style: italic;">/*     2     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* XXX 1 byte hole, try to pack */</span>
&nbsp;
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span>               gamma<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     4     4 */</span>
	<span style="color: #993333;">unsigned</span> <span style="color: #993333;">char</span>              delta<span style="color: #339933;">;</span>        <span style="color: #808080; font-style: italic;">/*     8     1 */</span>
&nbsp;
	<span style="color: #808080; font-style: italic;">/* size: 12, cachelines: 1, members: 4 */</span>
	<span style="color: #808080; font-style: italic;">/* sum members: 8, holes: 1, sum holes: 1 */</span>
	<span style="color: #808080; font-style: italic;">/* padding: 3 */</span>
	<span style="color: #808080; font-style: italic;">/* last cacheline: 12 bytes */</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Der hinzugef&#252;gte Kommentar enth&#228;lt f&#252;r jedes Element die Adresse in Bezug auf den Anfang der Struktur und die Gr&#246;&#223;e des Elementes. Zus&#228;tzlich werden L&#246;cher in den Strukturen und die Gesamtgr&#246;&#223;e der Struktur angegeben.</p>
<p>Neben der Identifikation der ungenutzten Speicherbereiche kann mit dem Befehl</p>
<pre>
pahole -RC test_data hello
</pre>
<p>auch ein Hinweis f&#252;r die Reorganisation der Elemente ausgegeben werden. Im vorhandenen Beispiel w&#228;re dies die Anordnung des Elementes delta nach beta und vor gamma um das Loch von einem Byte zu f&#252;llen.</p>
<p>Abschlie&#223;end bleibt anzumerken, dass die Relevanz dieser Optimierungen auf modernen 64-bit Architekturen h&#246;her ist, da durch die gr&#246;&#223;ere Verarbeitungsbreite L&#246;cher in den Strukturen h&#228;ufiger auftreten und diese auch gr&#246;&#223;er sind.</p>


<p><strong>Ähnliche Artikel:</strong><ol><li><a href='http://www.datenkobold.de/weblog/2011/02/hardware-pwm-fuer-foxboard-g20' rel='bookmark' title='Hardware-PWM f&#252;r Foxboard G20'>Hardware-PWM f&#252;r Foxboard G20</a></li>
<li><a href='http://www.datenkobold.de/weblog/2007/01/arithmetik-ohne-begrenzungen' rel='bookmark' title='Arithmetik ohne Begrenzungen'>Arithmetik ohne Begrenzungen</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://www.datenkobold.de/weblog/2009/12/speicheroptimierung-mit-pahole/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

