<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Boost ASIO und Heap Allokation]]></title><description><![CDATA[<p>ich habe einen Server mit Boost-ASIO (C++03) mit boost::bind implementiert und dann festgestellt das sich mein Speicherbedarf ständig veraendert (im TaskManager) - das möchte ich gerne komplett vermeiden und habe einen handler_allocator</p>
<p>wie in diesem diesem ASIO-Beispiel:</p>
<p><a href="http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp03/allocation/server.cpp" rel="nofollow">http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp03/allocation/server.cpp</a></p>
<p>implementiert (und an allen boost::bind stellen verwendet) - nur eben mit einem Fix-Size Pool ohne Rücksprung auf &quot;new&quot;</p>
<p>aber selbst mit dieser Änderung wackelt meine Speicherauslastung immer noch hin/her - besonders schön zu sehen wenn mal mehr als 300 Client verbunden sind</p>
<p>mein Code ist völlig frei von Allokationen jeglicher Art und ich kann ihn leider nicht herzeigen</p>
<p>hat jemand eine Idee</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337491/boost-asio-und-heap-allokation</link><generator>RSS for Node</generator><lastBuildDate>Fri, 17 Apr 2026 23:44:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337491.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 06 Apr 2016 10:36:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Wed, 06 Apr 2016 10:36:02 GMT]]></title><description><![CDATA[<p>ich habe einen Server mit Boost-ASIO (C++03) mit boost::bind implementiert und dann festgestellt das sich mein Speicherbedarf ständig veraendert (im TaskManager) - das möchte ich gerne komplett vermeiden und habe einen handler_allocator</p>
<p>wie in diesem diesem ASIO-Beispiel:</p>
<p><a href="http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp03/allocation/server.cpp" rel="nofollow">http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/example/cpp03/allocation/server.cpp</a></p>
<p>implementiert (und an allen boost::bind stellen verwendet) - nur eben mit einem Fix-Size Pool ohne Rücksprung auf &quot;new&quot;</p>
<p>aber selbst mit dieser Änderung wackelt meine Speicherauslastung immer noch hin/her - besonders schön zu sehen wenn mal mehr als 300 Client verbunden sind</p>
<p>mein Code ist völlig frei von Allokationen jeglicher Art und ich kann ihn leider nicht herzeigen</p>
<p>hat jemand eine Idee</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492440</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Wed, 06 Apr 2016 10:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Wed, 06 Apr 2016 10:55:45 GMT]]></title><description><![CDATA[<p>jetzt setze ich den allocation_handler server-weit ein - hilft schon mal<br />
und ich brauche noch einen pool für meine Sessions</p>
<p>also muss ich erstmal etwas umbauen - melde ich nochmal falls das alles nichts hilft</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492442</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492442</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Wed, 06 Apr 2016 10:55:45 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Wed, 06 Apr 2016 12:58:09 GMT]]></title><description><![CDATA[<p>Warum ist es überhaupt wichtig dass der &quot;Speicherverbrauch&quot; deines Programms konstant ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492451</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492451</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 06 Apr 2016 12:58:09 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Wed, 06 Apr 2016 13:30:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Warum ist es überhaupt wichtig dass der &quot;Speicherverbrauch&quot; deines Programms konstant ist?</p>
</blockquote>
<p>Ich versuche Thread-Locking/Deadlock-Probleme in einer Applikation zu &quot;beweisen&quot; - gerade ist die Regel je schneller um so mehr Fehler - ich will die Rate so hoch wie möglich bringen damit mir keiner kommen kann mit &quot;passiert zu selten&quot;</p>
<p>durch die permanente Heap-Allokation wird einfach die Latenz größer</p>
<p>Das Heap-Problem habe ich jetzt gelöst (Pool fuer boost::bind und Pool für Client-Server-Sessions) - rennt wie sau, absolut kein Byte hin oder her</p>
<p>was mir noch auffällt ist das aber der Handle-Count im TaskManager ständig rauf/runtergeht - und ich mache nach meiner Ansicht nach nicht was Windows-Handles benötigt - hat da jemand noch eine Idee</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492455</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Wed, 06 Apr 2016 13:30:07 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Wed, 06 Apr 2016 23:36:32 GMT]]></title><description><![CDATA[<p>Ah, verstehe.<br />
Wundert mich dass das echt so viel Performance bringt - zumindest wenn die Pools selbst Threadsafe sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
(Oder kannst du per-Thread Pools verwenden?)</p>
<p>Gast3 schrieb:</p>
<blockquote>
<p>was mir noch auffällt ist das aber der Handle-Count im TaskManager ständig rauf/runtergeht - und ich mache nach meiner Ansicht nach nicht was Windows-Handles benötigt - hat da jemand noch eine Idee</p>
</blockquote>
<p>Naja, über Handles geht in Windows ziemlich viel.</p>
<p>Eine (nicht vollständige) Liste von Dingen die über Handles angesprochen werden gibt's in der <code>CloseHandle</code> Doku: <a href="https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211%28v=vs.85%29.aspx" rel="nofollow">https://msdn.microsoft.com/en-us/library/windows/desktop/ms724211(v=vs.85).aspx</a></p>
<blockquote>
<p>Access token<br />
Communications device<br />
Console input<br />
Console screen buffer<br />
Event<br />
File<br />
File mapping<br />
I/O completion port<br />
Job<br />
Mailslot<br />
Memory resource notification<br />
Mutex<br />
Named pipe<br />
Pipe<br />
Process<br />
Semaphore<br />
Thread<br />
Transaction<br />
Waitable timer</p>
</blockquote>
<p>Weiters sind auch bei Sockets Handles im Spiel. Verbindungen zu diversen Geräten oder Kommunikation mit Treibern läuft normalerweise auch über Handles.</p>
<p>Also doch einiges.<br />
Davon werden etliche per Connection anfallen (Socket) und möglicherweise auch welche temporär für diverse Dinge die die ASIO &quot;so zwischendurch&quot; machen muss (vielleicht Waitable timer, Threads, File-Mappings, Events oder so).</p>
<p>----</p>
<p>Hast du die Fehlerquelle denn schon gefunden und willst/musst jetzt nur beweisen dass das wirklich Fehler macht (weil du nicht formal beweisen kannst dass es eine Fehlerquelle ist bzw. keiner deiner Kollegen den Beweis nachvollziehen kann)?<br />
Oder bist du nur der Meinung dass es wohl irgendwas in Richtung Deadlock sein wird, ohne den Fehler lokalisiert zu habe?</p>
<p>Gibt nämlich auch Tools mit denen sich solche Sachen z.T. recht schnell finden lassen. Das Schöne dabei ist dass man bei den Tools den Fehler nicht unbedingt reproduzieren muss. Wenn das Tool &quot;inkompatible&quot; Locking-Reihenfolge aufzeichnet reicht das normalerweise als Beweis dass ein Fehler vorliegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492504</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 06 Apr 2016 23:36:32 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Thu, 07 Apr 2016 05:39:29 GMT]]></title><description><![CDATA[<blockquote>
<p>Ah, verstehe.<br />
Wundert mich dass das echt so viel Performance bringt - zumindest wenn die Pools selbst Threadsafe sind <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
(Oder kannst du per-Thread Pools verwenden?)</p>
</blockquote>
<p>ich hab nur 1 Thread und skaliere über Prozesse, mein Test macht (im Nachtlauf) ohne die ASIO/Allokatoren Optimierung fast 3stellig-Mio Allokationen (168 und 140 byte Blöcke), brauche aber keine Threadsicherheit (da nur ein Thread) daher ist es nur ein Stack mit freiem Speicherplatz in den ich pushe/poppe (schneller gehts nicht)</p>
<p>unnötige dynamische Allokation (sinnvoll) zu verhindern bringt meistens sehr viel - was schlimmeres als new/delete gibt es kaum wenn es um Latenz geht - deswegen hat ASIO ja auch ein Server-Beispiel bei dem gezeigt wird wie man das verhindern kann</p>
<blockquote>
<p>Weiters sind auch bei Sockets Handles im Spiel. Verbindungen zu diversen Geräten oder Kommunikation mit Treibern läuft normalerweise auch über Handles.</p>
</blockquote>
<p>klar geht viele in Windows über Handles - ich frage mich aber doch warum die ständig im 2 stelligen Bereich auftauchen/wegfallen - ach ja mein Test macht Connect/Disconnect Tests - liegt wohl daran</p>
<blockquote>
<p>Hast du die Fehlerquelle denn schon gefunden und willst/musst jetzt nur beweisen dass das wirklich Fehler macht (weil du nicht formal beweisen kannst dass es eine Fehlerquelle ist bzw. keiner deiner Kollegen den Beweis nachvollziehen kann)?<br />
Oder bist du nur der Meinung dass es wohl irgendwas in Richtung Deadlock sein wird, ohne den Fehler lokalisiert zu habe?</p>
</blockquote>
<p>ich habe mehrere Fehlerquellen gefunden (darf nicht einfach fixen) - die werden &quot;noch&quot; nicht als Fehler von den Kollegen akzeptiert (Fehlerrate noch nicht hoch genug um es als &quot;böse&quot; wahrzunehmen) - mein Tool zeigt permanent Probleme und soll den Widerstand brechen/auswaschen</p>
<blockquote>
<p>Gibt nämlich auch Tools mit denen sich solche Sachen z.T. recht schnell finden lassen. Das Schöne dabei ist dass man bei den Tools den Fehler nicht unbedingt reproduzieren muss. Wenn das Tool &quot;inkompatible&quot; Locking-Reihenfolge aufzeichnet reicht das normalerweise als Beweis dass ein Fehler vorliegt.</p>
</blockquote>
<p>die Linux-Version zeigt mit dem ThreadSanitizer unsichere Zugriffe von verschiedenen Threads auf Variablen - und mein Test erkennt Deadlocks anhand einer voreingestellten mind. Reaktionszeit</p>
<p>welche Tools meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492515</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Thu, 07 Apr 2016 05:39:29 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Thu, 07 Apr 2016 10:19:52 GMT]]></title><description><![CDATA[<p>Kann dir kein spezielles Tool empfehlen, google einfach mal nach &quot;deadlock detector c++&quot;.</p>
<p>Gast3 schrieb:</p>
<blockquote>
<p>ich hab nur 1 Thread und skaliere über Prozesse, mein Test macht (im Nachtlauf) ohne die ASIO/Allokatoren Optimierung fast 3stellig-Mio Allokationen (168 und 140 byte Blöcke)</p>
</blockquote>
<p>Sagen wir 350 Mio Allokationen bei 3,5 GHz. Sagen wir 1000 Zyklen pro Allokation+Deallokation - was mMn. schon grosszügig geschätzt ist, moderne Allokatoren sollten mit wesentlich weniger auskommen.<br />
Dann wären das 100 Sekunden im Allokator verbracht bei 'nem Test der die ganze Nacht läuft. Schreckt mich jetzt nicht.</p>
<p>Wenn es sich allerdings so sehr anbietet wie bei dir, dann ist gegen Pools auch nix zu sagen.</p>
<p>Gast3 schrieb:</p>
<blockquote>
<p>unnötige dynamische Allokation (sinnvoll) zu verhindern bringt meistens sehr viel - was schlimmeres als new/delete gibt es kaum wenn es um Latenz geht</p>
</blockquote>
<p>Halte ich für ne Urban Legend <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>BTW: Welche Art Software programmiert ihr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492542</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 07 Apr 2016 10:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Boost ASIO und Heap Allokation on Thu, 07 Apr 2016 12:51:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Halte ich für ne Urban Legend</p>
</blockquote>
<p>eher: für Standard-Applikationen nicht so relevant</p>
<p>oder: die meisten Entwickler haben keine Ahnung wer was wo wie kostet und wenn Sie dann &quot;optimieren&quot; wird es meist schlimmer</p>
<p>nach meiner Meinung ist deine &quot;Urban Legend&quot; eher die Forderung: Schuster, bleib bei deinem Leisten - fürs einfache Entwicklervolk</p>
<p>IO, Heap und Locking sind die 3 Standard-Bösen im Performanz/Latenz-Spiel bei embedded, hochskalierend oder rechenintensiv</p>
<p>und hoher/untypischer Durchsatz zeigt im Threading-Bereich doch immer noch die meisten Probleme auf</p>
<blockquote>
<p>Welche Art Software programmiert ihr?</p>
</blockquote>
<p>ihr stimmt nicht ganz - eher ein Projekt an dem ich zur Zeit arbeite - Messdatenerfassung mit sehr vielen kleinen Clients</p>
<p>ich arbeite gerne in Projekten wo die Geschwindigkeit/Reaktionsfähigkeit nicht in &quot;schön schnell&quot; gemessen wird also wo Ressourcenmangel oder die geforderte Performanz die 3 Bösen sehr oft zu einem Problem werden lassen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2492558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2492558</guid><dc:creator><![CDATA[Gast3]]></dc:creator><pubDate>Thu, 07 Apr 2016 12:51:03 GMT</pubDate></item></channel></rss>