Linux vs. Windows (Split aus: Allgemeine Funktion um verfügbaren Speicher zu ermitteln?)


  • Mod

    Forkstackerdriver schrieb:

    Windows hat ja für das Problem, dass Programme über längere Zeit zu viel Speicher reservieren, mittlerweile noch eine andere Lösung gefunden.
    Siehe dazu https://www.c-plusplus.net/forum/344206

    *SCNR*, mfg, Uptimer

    lol. Das akzeptiere ich fortan als die beste Art und Weise, ein System stets zuverlässig zu halten 😃 👍



  • SeppJ schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    hustbaer schrieb:

    Nen OS Daemon der wenns knapp wird einfach mal so beschliesst irgendwelche Prozesse wegzukillen kann Windows natürlich nicht bieten.

    Ernste Frage: Was passiert bei Windows stattdessen?

    Na es fliegen bad_alloc , malloc gibt NULL zurück etc.
    Oder was meinst du?

    Heißt das, das System ist dann für immer blockiert, weil man den Verursacher nicht abschießen kann? Weil man den Taskmanager/Konsole wegen Speichermangels nicht starten kann.

    Ich könnte also ein Windowssystem mit

    while(True) calloc(1, 1);
    

    mit einem Schlag lahmlegen? Das ist ja schon ziemlich nahe dran an dem, was jemand im Ursprungthread zur Speichervermessung vorgeschlagen hatte. Ein paar Zeichen vertippt und er hätte dies gehabt. Es finde es nicht so weit hergeholt, dass es Programme gibt, die eine bad_alloc abfangen und sich dann eben nicht sofort beenden.

    Möglich. Allerdings verwende ich nun schon wirklich lange Windows, und seit ich Rechner mit > 4 GB RAM habe kann ich mich an keine solche Situation erinnern. Ist also eher ein theoretisches Problem. Also schon eines das man in der Praxis vermutlich ganz einfach absichtlich herbeiführen kann, aber eines das halt ansonsten kaum auftritt.

    Jetzt direkt hab' ich keine Zeit, aber wenn ich heute später nochmal dran denke werd' ich das ausprobieren. Gibt ja schliesslich fertige Tools die genau dafür gemacht sind "out of memory" Conditions zu produzieren - zum Testen wie stabil Programme unter solchen Umständen laufen. Hab' ich erst letztens in der Arbeit gemacht. Dabei hab' ich den Speicherfresser allerdings mit Ctrl+C abgebrochen (hatte ein Kommandozeilenprogramm verwendet). Daher weiss ich nicht ob man es schafft dann noch den Task-Manager aufzumachen.

    SeppJ schrieb:

    hustbaer schrieb:

    SeppJ schrieb:

    dfdggdf schrieb:

    Es gibt ja Spiele, die sowohl auf Windows als auch auf Linux laufen. Gibt es dazu vergleichende Benchmarks?

    Kann man nicht sinnvoll vergleichen. Wenn man die exakt gleich konfigurierte Engine eines Spiels auf ein anderes Betriebssystem überträgt, dann wird es schnarchlahm sein. Wenn man also zwei verschiedene Versionen eines Spiels vergleicht, dann misst man in aller Regel nur, wie viel Arbeit der Entwickler jeweils in Optimierungen für diese Plattform gesteckt hat.

    Was soll das gross mit dem OS zu tun haben? Man müsste einfach Spiele vergleichen die auch auf Windows Vulkan verwenden.

    Und das Grafikframework ist das einzige, was zählt? Absolut kein Zusammenhang dazu, wie die Daten in das Framework kommen, wie das Framework genau konfiguriert ist, oder zum sonstigen Drumherum? Es gab mal einen tollen Artikel, ich glaube auf Heise, aber eventuell war es auch Golem, wie Valve ihre Sourceengine nach Linux portiert haben. Da standen viele solche Probleme beschrieben, und wie sie aus der lahmen direkten Portierung mit ein paar einfachen Anpassungen eine spielbare erste Version machten. Und die Entwickler erklärten, wie man solche Optimierungen natürlich umgekehrt auch machte, als man die Engine überhaupt das erste Mal für Windows entwickelt hat. Ich finde ihn leider nicht, aber es klang alles recht plausibel. Da ich selber nur interessierter Laie auf dem Gebiet von Hochleistungsspieleengines bin (und ich erlaube mir auch mal die Vermutung, dass dies für dich ebenfalls gilt), bin ich geneigt, denen, die so etwas tatsächlich beruflich entwickeln eher zu glauben, als der "müsste doch"-Einschätzung eines Außenstehenden.

    Wäre interessant was das für Anpassungen waren. Hast du zufällig den Link zu dem Aritkel noch? Würde mich interessieren.

    Mir fällt halt nicht wirklich etwas ein, was man unter Linux anders machen müsste als unter Windows. Also speziell bei dem was Spiele so machen. Kann natürlich sein dass ich mich da verschätze - gerade deswegen wäre ja der Artikel interessant.



  • Forkstackerdriver schrieb:

    Und es stellt sich die Frage, inwieweit man allgemein vor solchen Angriffen gewappnet sein muss (da wo es drauf ankommt, gibt es ja Loesungen fuer Linux und vermutlich auch fuer Windows).

    Das Prozess-Abschiessen bei OOM, finde ich aber durchaus angebracht. Einfach gar nichts machen ist jedenfalls kaum besser.

    Für mich stellen sich zwei Fragen.
    Erstmal was du schon schreibst, also ob es überhaupt nötig ist eine fest eingebaute Lösung für solche Fälle zu haben, die ohne vorherige Konfiguration und/oder Zutun des Benutzers etwas unternimmt.

    Und dann: was sollte in so einem Fall sinnvollerweise unternommen werden? Ich finde es auf jeden Fall sehr fragwürdig einfach anhand irgend einer Metrik einen oder mehrere Prozesse auszuwählen und diese dann zu killen. Dann lieber noch das ganze System neu starten. Das aber bitte auch nur als opt-in. Für die meisten Server wäre das IMO die bessere Variante. Denn durch Wegschiessen irgendwelcher Prozesse kann man Server recht leicht in einen Zustand versetzen wo sie zwar ewig weiterlaufen werden und auch kein "out of memory" mehr produzieren werden, aber die gehostete Anwendung einfach nicht mehr funktioniert. Was ich ehrlich gesagt nicht so sexy finde.

    Gibt auch einige Interessante Beiträge dazu, z.B.:
    http://thoughts.davisjeff.com/2009/11/29/linux-oom-killer/

    Ich weiss nicht ob die "badness" Metrik diesbezüglich schon gefixt wurde. Aber das was da beschrieben ist liest sich für mich nicht so prickelnd.



  • hustbaer schrieb:

    Ansonsten hat man einen Vergleich Direct3D vs. OGL/Vulkan. Und den gewinnt im Moment Direct3D. Woran das liegt kann ich nicht sagen. Kann natürlich dran liegen dass das D3D Backend der Game Engines besser optimiert ist als das Vulkan Backend. Kann aber auch sein dass einfach die D3D Treiber besser sind.

    oder daran, dass die entwickler keine lust haben, ihren quellcode offen legen zu müssen und daher auf sog. Adapter-Pattern (heißt das so?) zurückgreifen müssen und jeder furz erst einmal durchgereicht und das ergebnis dann zurückgereicht werden muss, was eben Zeit kostet. 🙄

    Jedenfalls habe ich mir das in Bezug auf binäre Linux-Kernel-Treiber so erklären lassen und Direct3D kann ja vom Compiler entsprechend in Treiber-Funktionen oder was auch immer umgewandelt werden, denke ich mal.



  • hustbaer schrieb:

    Und dann: was sollte in so einem Fall sinnvollerweise unternommen werden? Ich finde es auf jeden Fall sehr fragwürdig einfach anhand irgend einer Metrik einen oder mehrere Prozesse auszuwählen und diese dann zu killen. Dann lieber noch das ganze System neu starten. Das aber bitte auch nur als opt-in. Für die meisten Server wäre das IMO die bessere Variante. Denn durch Wegschiessen irgendwelcher Prozesse kann man Server recht leicht in einen Zustand versetzen wo sie zwar ewig weiterlaufen werden und auch kein "out of memory" mehr produzieren werden, aber die gehostete Anwendung einfach nicht mehr funktioniert. Was ich ehrlich gesagt nicht so sexy finde.

    Gibt auch einige Interessante Beiträge dazu, z.B.:
    http://thoughts.davisjeff.com/2009/11/29/linux-oom-killer/

    Ich weiss nicht ob die "badness" Metrik diesbezüglich schon gefixt wurde. Aber das was da beschrieben ist liest sich für mich nicht so prickelnd.

    Ich setze bei den OOM-Kills schon voraus, dass man geziehlt bestimmte Prozesse davon ausschliessen kann.
    Habe mal den ersten google-Treffer herausgesucht: http://elixir.free-electrons.com/linux/v4.1/source/mm/oom_kill.c#L140
    Da gibt es auf jeden fall bool unkillable_task() .

    PostgreSQL ist womoeglich ein Kandidat dafuer.

    Ein anderer Kandidat waere ein logging-Daemon, achja und natuerlich jeder andere Prozess, der das System am Leben haelt. Ein Neustart ist dir echt lieber als das nur ein Prozess gekillt wird? (Ich denke i.d.R. ist das ja auch der Problemprozess)



  • Forkstackerdriver schrieb:

    Ich setze bei den OOM-Kills schon voraus, dass man geziehlt bestimmte Prozesse davon ausschliessen kann.
    Habe mal den ersten google-Treffer herausgesucht: http://elixir.free-electrons.com/linux/v4.1/source/mm/oom_kill.c#L140
    Da gibt es auf jeden fall bool unkillable_task() .

    Wo, "da"?

    Forkstackerdriver schrieb:

    PostgreSQL ist womoeglich ein Kandidat dafuer.

    Ein anderer Kandidat waere ein logging-Daemon, achja und natuerlich jeder andere Prozess, der das System am Leben haelt.

    Kandidat für was?

    Forkstackerdriver schrieb:

    Ein Neustart ist dir echt lieber als das nur ein Prozess gekillt wird? (Ich denke i.d.R. ist das ja auch der Problemprozess)

    Ja, weil nach einem Neustart normalerweise alles wieder startet was nötig ist. Wenn man einfach so Prozesse wegschiesst garantiert mir das keiner.



  • hustbaer schrieb:

    Forkstackerdriver schrieb:

    Ich setze bei den OOM-Kills schon voraus, dass man geziehlt bestimmte Prozesse davon ausschliessen kann.
    Habe mal den ersten google-Treffer herausgesucht: http://elixir.free-electrons.com/linux/v4.1/source/mm/oom_kill.c#L140
    Da gibt es auf jeden fall bool unkillable_task() .

    Wo, "da"? [...] Kandidat für was?

    na da, gleich am Anfang in der verlinkten Funktion wird auf unkillable_task getestet. Aber ich bin kein Kernelprogrammierer. Bin wie gesagt davon ausgegangen, dass man da Einfluss nehmen kann.

    Kandidat um in die Liste an Prozessen aufgenommen zu werden, die nicht "einfach" so gekillt werden.
    Wenn entsprechende wichtige Prozesse am Leben bleiben, können auch die Fehlerhaften Prozess einfach neu gestartet werden. Dazu braucht es keinen Systemreset.



  • SeppJ schrieb:

    Ich könnte also ein Windowssystem mit

    while(True) calloc(1, 1);
    

    mit einem Schlag lahmlegen?

    Nette Idee 🙂 Ich habs letzten Freitag bei der Arbeit mal ausprobiert und Win10 damit zum Stillstand gebracht.

    Es wäre interessant, das Experiment mit einem Rechner ohne Pagefile zu wiederholen, ich vermute nämlich, daß der Stillstand daher rührt, daß Windows zum Schluß nur noch mit Paging beschäftigt ist (was bei diesem Rechner besonders schwerwiegend ist, da er noch eine HDD verwendet).

    SeppJ schrieb:

    Wie viele Programme haben unabsichtliche Speicherlecks und wie viele haben unabsichtliche Threadlecks?

    Ob dein Programm ein Speicherleck hat, oder ob es unerbittlich und von fehlschlagenden Allokationen unbeeindruckt jeden freiwerdenden Speicherblock absorbiert, ist ja wohl ein Unterschied. Und Windows ist durchaus in der Lage, gewöhnliche Speicherknappheit zu erkennen, und zeigt dann eine Warnmeldung an, die auch anbietet, den Speicherfresser zu terminieren: https://i.stack.imgur.com/HkjXK.png.

    Durch dieses Verhalten erklärt sich auch meine Erfahrung, daß man (Desktop-)Windows besser mit Pagefile betreiben sollte, besonders wenn man nur 3 oder 4 GB RAM im Rechner hat (was an sich für sehr viele Anwendungsfälle vollkommen ausreicht). Solange ein Pagefile da ist, ist Overcommitting kein Problem, aber andernfalls sieht man öfters solche Dialoge oder gar Fehlverhalten von Programmen, die mit out-of-memory nicht zurechtkommen.



  • Forkstackerdriver schrieb:

    hustbaer schrieb:

    Forkstackerdriver schrieb:

    Ich setze bei den OOM-Kills schon voraus, dass man geziehlt bestimmte Prozesse davon ausschliessen kann.
    Habe mal den ersten google-Treffer herausgesucht: http://elixir.free-electrons.com/linux/v4.1/source/mm/oom_kill.c#L140
    Da gibt es auf jeden fall bool unkillable_task() .

    Wo, "da"? [...] Kandidat für was?

    na da, gleich am Anfang in der verlinkten Funktion wird auf unkillable_task getestet. Aber ich bin kein Kernelprogrammierer. Bin wie gesagt davon ausgegangen, dass man da Einfluss nehmen kann.

    Meinst du oom_unkillable_task ? Die Implementierung davon steht direkt über der von dir verlinkten. Ich sehe da nix was für mich so aussieht als ob man da seinen Prozess irgendwie "registrieren" könnte.

    Forkstackerdriver schrieb:

    Kandidat um in die Liste an Prozessen aufgenommen zu werden, die nicht "einfach" so gekillt werden.
    Wenn entsprechende wichtige Prozesse am Leben bleiben, können auch die Fehlerhaften Prozess einfach neu gestartet werden. Dazu braucht es keinen Systemreset.

    Naja...
    Wenn das Programm selbst sagen kann "ich darf nicht OOK-gekillt werden", dann ist der OOM-Killer auch wieder für die Würste. Dann hast du den Bug nämlich in einem Programm welches, weil der Programmierer ja sooooooo schlau war, sich als "darf nicht OOK-gekillt werden" flaggt, aber trotzdem ein böses Leak enthält.
    Und wenn es eine vom Sysop definierte Liste gibt, dann hast du quasi das selbe Problem, nämlich dass der Sysop sich für schlau hält und ein Programm einträgt dass dann doch wieder leakt.

    Der OOM Killer bringt also vielleicht für Desktops 'was, wenn man davon ausgeht dass der Benutzer schlau genug ist nicht stundenlang Fehler zu suchen nur weil der OOM-Killer ihm was weggeschossen hat. Weil der PC dann bedienbar bleibt und er nicht alle ungespeicherten Daten verliert. Für Server aber IMO eher nicht, weil es IMO recht viel Aufwand ist das System so zu konfigurieren, dass alles immer zuverlässig neu gestartet wird wenn es OOM-weggeschossen wird.
    Speziell auf Windows wo man nicht einfach "starte das Service neu" in den Service-Optionen reinklickt wenn man möchte dass ein Service im Fehlerfall neu gestartet wird. Wenn man Glück hat bringt das service nen eigenen Watchdog mit. Und wenn nicht, dann darf man selbst Bashen oder sonstwas. Und dann natürlich alle Varianten testen, also alle möglichen Reihenfolgen in denen einer (oder mehrere) der 20 Prozesse die man in "modernen" Anwendungsstacks so braucht weggeschossen und dann neu gestartet werden. Hui.

    Die robustere Variante ist da IMO echt einfach die ganze Kiste durchzustarten.



  • hustbaer schrieb:

    Meinst du oom_unkillable_task ? Die Implementierung davon steht direkt über der von dir verlinkten. Ich sehe da nix was für mich so aussieht als ob man da seinen Prozess irgendwie "registrieren" könnte.

    ja, fiel mir später auch auf. Aber zur Not könnte man das ja selbst erweitern bzw. wenn das wirklich ein gängiges Problem darstellen sollte, haben das sicherlich schon andere gemacht.

    Wenn das Programm selbst sagen kann "ich darf nicht OOK-gekillt werden", dann ist der OOM-Killer auch wieder für die Würste. [...]
    Und wenn es eine vom Sysop definierte Liste gibt, dann hast du quasi das selbe Problem, nämlich dass der Sysop sich für schlau hält und ein Programm einträgt dass dann doch wieder leakt.

    Ich meinte natürlich, dass der Admin das macht. Denke nicht, dass man dessen Unfähigkeitsfaktor mit in die Gleichung aufnehmen muss.

    Der OOM Killer bringt also vielleicht für Desktops 'was, wenn man davon ausgeht dass der Benutzer schlau genug ist nicht stundenlang Fehler zu suchen nur weil der OOM-Killer ihm was weggeschossen hat.

    Ob ein Prozess gekillt wird weil er zu viel Speicher benoetigt oder einfach wegen einer Zugriffsverletzung, kommt ja aufs selbe hinaus. In beiden Fällen steht eine ensprechende Meldung im syslog. Den PC neustarten, weil ein Userspace-Prozess den falschen Speicher schreibt? Die Win9x-Zeiten sind ja zum Glück vorbei.

    Für Server aber IMO eher nicht, weil es IMO recht viel Aufwand ist das System so zu konfigurieren, dass alles immer zuverlässig neu gestartet wird wenn es OOM-weggeschossen wird.

    Ich glaube du siehst das etwas zu schwarz. Es ist ja nicht so, dass wahllos irgendwelche Prozesse abgeschossen werden sondern normalerweise trifft es schon den richtigen.


  • Mod

    Kleiner Einwurf ohne alles gelesen zu haben: für den Task Manager wird unter Windows bereits beim Booten genügend Speicher reserviert. Auch die notwendigen GDI-Handles werden afaik reserviert. Somit sind immer genügend Speicher/Handles verfügbar um den Task Manager zu starten und Prozesse abzuschießen.

    MfG SideWinder



  • Hat jemand eine Erklärung dafür, dass unter Kubuntu LaTeX schneller läuft als auf Windows?



  • cvxvvcx schrieb:

    Hat jemand eine Erklärung dafür, dass unter Kubuntu LaTeX schneller läuft als auf Windows?

    Ich würde davon ausgehen, dass das an der enormen Menge an Konsolenausgaben liegt, die Latex standardmäßig macht. Die Windows-Konsole bremst enorm. Gib mal -quiet mit an, und schau, ob es besser wird.



  • Mr X schrieb:

    cvxvvcx schrieb:

    Hat jemand eine Erklärung dafür, dass unter Kubuntu LaTeX schneller läuft als auf Windows?

    Ich würde davon ausgehen, dass das an der enormen Menge an Konsolenausgaben liegt, die Latex standardmäßig macht. Die Windows-Konsole bremst enorm. Gib mal -quiet mit an, und schau, ob es besser wird.

    Ich führe LaTeX aus TeXstudio aus, also keine Konsole. Meine Vermutung ist, dass Linux Festplattenzugriffe cached.



  • Viele Linux-Programme laufen unter Windows langsamer, ist auch mit Git so. Warum sollte Latex da anders sein?
    Gibt verschiedene Gründe, z.B. weil ein Posix-Wrapper genutzt wird (Cygwin), oder weil nicht die nativen APIs benutzt werden... außerdem funkt andauernd der Virus-Scanner dazwischen, der ja seit Windows 7 standard ist.



  • Auch sind diverse File-System Sachen auf Windows leider immer noch langsamer als auf Linux. Bzw. umgekehrt: auf Linux sehr schnell. Daher enthalten viele Programme die in der Linux Welt entstanden sind viele File-System Calls. Was oft durch ne andere Architektur vermeidbar wäre, nur wenn kein guter Grund dagegen spricht, weil die Performance auf Linux eh gut genug ist, dann kann man es ja ruhig so machen. Beim Portieren auf Windows ist es dann langsam, nur bei nem Port kann man an der Architektur natürlich nix mehr ändern. Sonst wäre es ja kein Port sondern quasi ne Neuentwicklung.

    Ich hoffe allerdings immer noch dass sich da früher oder später mal 'was tun wird. Entweder dass ReFS weiterentwickelt wird, vielleicht so weit dass man es als Boot-FS verwenden kann, und da dann auch die Performance passt, oder dass MS es mit NTFS irgendwie hinbiegt.



  • SideWinder schrieb:

    Kleiner Einwurf ohne alles gelesen zu haben: für den Task Manager wird unter Windows bereits beim Booten genügend Speicher reserviert. Auch die notwendigen GDI-Handles werden afaik reserviert. Somit sind immer genügend Speicher/Handles verfügbar um den Task Manager zu starten und Prozesse abzuschießen.

    Hast du dazu einen Beleg, oder erinnerst du dich, woher du die Information hast? Würde mich interessieren.



  • Mich auch. Ich glaub das nömlich nicht so ganz. Weil halt das Ergebnis meines Versuchs dagegen spricht. Und weil es mMn. sehr viel Aufwand wäre. Da müsste man den Task-Manager schon in den Desktop-Window-Manager einbauen -- und das ist er AFAIK nicht.


  • Mod

    Ich wage mich zu erinnern, dass ich das auf Raymond Chans Blog (the old new thing) gelesen habe, kann es aber gerade nicht mehr finden. Da eure empirischen Ergebnisse anders sind, nehme ich die Aussage mal wieder zurück.

    Evtl. wars auch nur der Secure Desktop den man mit CTRL+ALT+DEL immer starten kann...

    MfG SideWinder



  • Hab's grad nochmal ausprobiert mit Testlimit.exe -m
    Weder der CTRL+ALT+DEL Screen noch der Taskmanager können mehr gestartet werden (Windows 10 x64 1703).

    Kann gut sein dass das mit dem CTRL+ALT+DEL Screen in älteren Windows Versionen mal garantiert war, aber aktuell ist es das ganz offensichtlich nicht (mehr).
    Gibt sogar ne schöne Fehlermeldung wo steht dass der Screen leider nicht angezeigt werden kann - vielleicht ist jetzt nur mehr Speicher für diese Fehlermeldung reserviert 🤡

    Ist natürlich schon doof irgendwie. Aber einfach Prozesse wegschiessen finde ich wie gesagt auch nicht gut. Die Variante mit "garantiert dass Task-Manager immer angezeigt werden kann" wäre da schon besser. Bringt aber auch nur was wenn man vor der Box sitzt. Denn per Remote-Desktop braucht man garantiert nicht versuchen sich in so einer Situation noch einzuloggen 🙂


Anmelden zum Antworten