{"id":173,"date":"2012-09-29T18:02:51","date_gmt":"2012-09-29T18:02:51","guid":{"rendered":"http:\/\/www.axelirriger.de\/?p=173"},"modified":"2012-10-07T18:55:18","modified_gmt":"2012-10-07T18:55:18","slug":"nebenlufigkeit-heute-eine-bersicht","status":"publish","type":"post","link":"https:\/\/www.axelirriger.de\/index.php\/2012\/09\/29\/nebenlufigkeit-heute-eine-bersicht\/","title":{"rendered":"Nebenl\u00e4ufigkeit heute: Eine \u00dcbersicht"},"content":{"rendered":"<div class=\"shariff\" data-title=\"Nebenl\u00e4ufigkeit heute: Eine \u00dcbersicht\" data-info-url=\"http:\/\/ct.de\/-2467514\" data-backend-url=\"https:\/\/www.axelirriger.de\/wp-content\/plugins\/shariff-sharing\/backend\/index.php\" data-temp=\"\/tmp\" data-ttl=\"60\" data-service=\"gftr\" data-services='[\"googleplus\",\"facebook\",\"twitter\",\"reddit\",\"info\"]' data-image=\"\" data-url=\"https:\/\/www.axelirriger.de\/index.php\/2012\/09\/29\/nebenlufigkeit-heute-eine-bersicht\/\" data-lang=\"en\" data-theme=\"colored\" data-orientation=\"horizontal\"><\/div><p>Die Entwicklung von Software im Unternehmensumfeld war bis vor einigen Jahren gut beherrschbar. Im Zweifel wurde \u00a0f\u00fcr eine neue Aufgabe ein gr\u00f6\u00dferer Server angeschafft. Die heutigen Aufgaben m\u00fcssen aber mit solchen Datenvolumen umgehen, dass dies keine L\u00f6sung mehr ist. Au\u00dferdem hat sich die Infrastruktur weiterentwickelt. Es gibt nicht gr\u00f6\u00dfere Server, sondern mehr Server. Was bedeutet das f\u00fcr die traditionelle Software-Entwicklung? Ein Blick in die Infrastruktur-Ecke hilft.<\/p>\n<p><!--more--><\/p>\n<h1>Die moderne Infrastruktur<\/h1>\n<p>Um mit gr\u00f6\u00dferen Datenmengen oder mehr Anfragen umzugehen,\u00a0gibt es nur eine beschr\u00e4nkte Menge an Alternativen:<\/p>\n<ul>\n<li>Den sequenziellen Ablauf beschleunigen. Dies erfolgt unter anderem \u00fcber das Chip-Design und die Taktfrequenz.<\/li>\n<li>Pseudo-Parallelit\u00e4t erm\u00f6glichen. Hierbei f\u00fchrt die CPU einen weiteren Prozess (\u201cThread\u201d) aus, w\u00e4hrend sie auf R\u00fcckmeldung wartet.<\/li>\n<li>Mehrere Threads ausf\u00fchren. Dies kann entweder auf Ebene der CPU erfolgen (\u201cMulti-Core\u201d), als auch auf Ebene der einzelnen Verarbeitungs-Linie (\u201cPipeline\u201d, \u201cMulti-Threading\u201d)<\/li>\n<\/ul>\n<p>Ein Blick in die aktuellen CPU-Architekturen zeigt, dass alle Varianten genutzt werden. Als Beispiel sollen ein Prozessor und ein Komplett-System dienen.<\/p>\n<h2>Der Prozessor: UltraSPARC T2<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" style=\"margin-left: 0px; margin-right: 0px;\" src=\"http:\/\/upload.wikimedia.org\/wikipedia\/en\/8\/83\/Ultrasparc_t2.png\" alt=\"\" width=\"300\" height=\"250\" align=\"left\" \/><\/p>\n<p>Eine ausf\u00fchrliche Beschreibung findet sich bei <a href=\"http:\/\/en.wikipedia.org\/wiki\/UltraSPARC_T2\">Wikipedia<\/a>. Folgende Fakten sind aber relevant:<\/p>\n<blockquote><p>The processor, [\u2026], is available with eight CPU cores, and each core is able to handle eight <a href=\"http:\/\/en.wikipedia.org\/wiki\/Thread_(computer_science)\">threads<\/a> concurrently. Thus the processor is capable of processing up to 64 concurrent threads. [\u2026] Speed bump for each thread, increased to 1.6 <a href=\"http:\/\/en.wikipedia.org\/wiki\/GHz\">GHz<\/a> from 1.2 GHz.<\/p><\/blockquote>\n<p>Was bedeutet dies nun f\u00fcr eine Anwendung, die auf solch einem System ausgef\u00fchrt wird? Eine Anwendung, die keinen Nutzen aus paralleler Verarbeitung ziehen kann, wird mit 1.6 GHz ausgef\u00fchrt. Au\u00dferdem wird die CPU bei solch einer Anwendung schlicht \u00fcberhaupt nicht ausgenutzt. Um einen solchen Prozessor effizient zu nutzen, bedarf es einer massiven Ausnutzung von Parallelit\u00e4t.<\/p>\n<p>Das optimale Nutzungsszenario f\u00fcr eine solche CPU ist die Verwendung von 64 Threads, die alle permanent ausgenutzt werden. Der Grund hierf\u00fcr liegt darin, dass jeder Thread-Wechsel auf einer Pipeline eine Menge Zeit kostet. Die Nutzung von mehr als 64 Threads bringen also theoretisch nur weitere Nachteile mit sich.<\/p>\n<p>Im Vergleich zu anderen Prozessoren jenseits der 3 Ghz sei noch angemerkt, dass dieser Prozessor im Single-Thread-Betrieb nicht sonderlich schnell ist. Um eine hohe Verarbeitungsgeschwindigkeit zu erreichen, kann auch hier nur Parallelit\u00e4t genutzt werden.<\/p>\n<h2>Das Komplett-System: SeaMicro SM10000-64HD<\/h2>\n<p><img decoding=\"async\" style=\"margin-left: 0px; margin-right: 0px;\" src=\"http:\/\/www.seamicro.com\/sites\/default\/files\/small_Frt_L3_N_Web.jpg\" alt=\"\" align=\"left\" \/> Auf der <a href=\"http:\/\/www.seamicro.com\/node\/212\">Homepage des Herstellers<\/a> kann man detaillierte Daten zu dem System nachlesen, allerdings ist der folgende Auszug schon interessant genug:<\/p>\n<blockquote><p>The SeaMicro SM10000 family of servers is the first purpose built for scale-out workloads. Designed to replace 60 1 RU Dual Socket Quad Core servers, the SM10000-64HD integrates 768 Intel Atom low power x86 cores [\u2026]<\/p><\/blockquote>\n<p>Ein einzelnes System mit 768 Intel Atom Prozessorkernen! Solch ein System eignet sich sehr gut daf\u00fcr, massiv parallele Berechnungen durchzuf\u00fchren oder sehr viele, virtualisierte Umgebungen zu betreiben. Damit sich das ganze effizient nutzen l\u00e4\u00dft, bedarf es aber Softwarem\u00f6glichkeiten, Probleme \u00fcber die Grenzen eines einzelnen Prozessors hinweg zu skalieren.<\/p>\n<h2>Und das bedeutet &#8230;<\/h2>\n<p>Die obigen exemplarischen Beispiele sollen eines verdeutlichen: bei der Nutzung einer modernen Infrastruktur geht es nicht mehr ohne Parallelit\u00e4t\/Multithreading sowie Verteilung \u00fcber Rechnergrenzen hinweg. Die Frage ist nun, wie kann dies geschehen?<\/p>\n<h1>Anforderungen an die Software-Entwicklung<\/h1>\n<p>Die Entwicklung von nebenl\u00e4ufigen Anwendungen (Multi-threading) und verteilten Systemen ist so alt wie das Internet. F\u00fcr moderne Architekturen, wie oben, gibt es unterschiedliche Ans\u00e4tze. <strong>Klassische L\u00f6sungen <\/strong>sind dabei:<\/p>\n<ul>\n<li><strong>Multi-Threading<\/strong>: Eine Anwendung wird dabei in mehreren Threads ausgef\u00fchrt. Dies funktioniert gut, solange sich das Problem auf eine CPU beschr\u00e4nkt.<\/li>\n<li><strong>Message-oriented Middleware (MoM):<\/strong> Hierbei wird von Sendern Nachrichten an eine zentrale Warteschlange gesendet und von Empf\u00e4ngern gelesen. Durch die M\u00f6glichkeit, Sender und Empf\u00e4nger zu multiplizieren, k\u00f6nnen auch \u00fcber Rechnergrenzen hinweg Berechnungen durchgef\u00fchrt werden.<\/li>\n<\/ul>\n<p>Die Probleme mit diesen Ans\u00e4tzen sind genauso vielschichtig, wie die Erfolge. Das Problem des Multi-Threadings ist, dass es hohe Anforderungen an den Entwickler stellt, um fehlerfrei solche Anwendungen zu entwickeln. Probleme wie Synchronisation und Deadlocks sind dabei allgegenw\u00e4rtig.<\/p>\n<p>Die Probleme der MoM liegen in dem zus\u00e4tzlichen Overhead, der gesteigerten Komplexit\u00e4t, sowie dem potenziellen SPOF (Single Point of Failure) durch eine weitere technische Komponente. Man kann all diese Probleme zwar in den Griff bekommen, aber nur auf Kosten von weiterer Komplexit\u00e4t.<\/p>\n<p>Demgegen\u00fcber stehen <strong>moderne Ans\u00e4tze<\/strong>:<\/p>\n<ul>\n<li><strong>Shared-nothing Ansatz:<\/strong>Ein Programmierparadigma, dass Skalierbarkeit dadurch erm\u00f6glicht, dass es keine expliziten Abh\u00e4ngigkeiten von zwei Komponenten zueinander gibt.<\/li>\n<li><strong>Aktoren-Modell:<\/strong>Hierbei wird das Modell der MoM in einer Programmiersprache m\u00f6glich gemacht und dabei die Komplexit\u00e4t verringert. Eine effiziente Implementierung minimiert optimiert dabei die Anzahl der genutzten Threads, um m\u00f6glichst wenige Threads neu zu erzeugen.<\/li>\n<li><strong>Software Transactional Memory:<\/strong> Hierbei wird Nebenl\u00e4ufigkeit durch explizite Transaktionen (wie man sie von Datenbanken kennt) vereinfacht.<\/li>\n<\/ul>\n<h1>Fazit<\/h1>\n<p>Der Trend zu mehr Prozessoren und mehr Nebenl\u00e4ufigkeit ist ganz klar da und wird sich fortsetzen. Die streng sequenzielle Bearbeitung von Berechnungen und Problemen geh\u00f6rt der Vergangenheit an und wird in immer weniger von Bedeutung sein. Um diese neuen Herausforderungen zu meistern, bedarf es neuer Ans\u00e4tze, um die Software-Entwicklung nicht noch komplexer zu machen, als sie bereits ist. Mit dem shared-nothing Ansatz, dem Aktoren-Modell und dem software-transactional Memory stehen verschiedene Modelle zu Verf\u00fcgung, verteilte Probleme elegant zu l\u00f6sen.<\/p>\n<div>\n<p>&nbsp;<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Die Entwicklung von Software im Unternehmensumfeld war bis vor einigen Jahren gut beherrschbar. Im Zweifel wurde \u00a0f\u00fcr eine neue Aufgabe ein gr\u00f6\u00dferer Server angeschafft. Die heutigen Aufgaben m\u00fcssen aber mit solchen Datenvolumen umgehen, dass dies keine L\u00f6sung mehr ist. Au\u00dferdem hat sich die Infrastruktur weiterentwickelt. Es gibt nicht gr\u00f6\u00dfere Server, sondern mehr Server. Was bedeutet &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.axelirriger.de\/index.php\/2012\/09\/29\/nebenlufigkeit-heute-eine-bersicht\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eNebenl\u00e4ufigkeit heute: Eine \u00dcbersicht\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0,"footnotes":""},"categories":[7,8],"tags":[76,18,74,75],"class_list":["post-173","post","type-post","status-publish","format-standard","hentry","category-software-entwicklung","category-the-cloud","tag-actor-model","tag-cloud-computing","tag-multi-core","tag-shared-nothing"],"_links":{"self":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/comments?post=173"}],"version-history":[{"count":9,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/173\/revisions"}],"predecessor-version":[{"id":198,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/posts\/173\/revisions\/198"}],"wp:attachment":[{"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/media?parent=173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/categories?post=173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.axelirriger.de\/index.php\/wp-json\/wp\/v2\/tags?post=173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}