Wie ermittle ich das passende Prüfintervall?

8

Ich fange gerade an, an einer Tornado-Anwendung zu arbeiten, die einige CPU-Probleme hat. Die CPU-Zeit wird monoton mit der Zeit wachsen und die CPU zu 100% ausschöpfen. Das System ist derzeit so ausgelegt, dass es den Hauptthread nicht blockiert. Wenn es etwas tun muss, dass Blöcke und asynchrone Treiber nicht verfügbar sind, erzeugt es einen anderen Thread, um die Blockierung durchzuführen.

Somit haben wir den Haupt-Thread fast vollständig CPU-gebunden und eine Menge anderer Threads, die fast vollständig IO-gebunden sind. Nach dem, was ich gelesen habe, scheint dies der perfekte Weg zu sein, Probleme mit der GIL zu bekommen. Außerdem zeigt mein Profiling, dass wir viel Zeit darauf verwenden, auf Signale zu warten (was ich annehme, ist, was __semwait_signal tut), was mit den Effekten übereinstimmt, die die GIL in meinem begrenzten Verständnis haben würde.

>

Wenn ich sys.setcheckinterval verwende, um das Prüfintervall auf 300 zu setzen, verlangsamt sich das CPU-Wachstum erheblich. Ich möchte herausfinden, ob ich das Prüfintervall erhöhen, es bei 300 belassen oder Angst haben sollte, es zu erhöhen. Immerhin merke ich, dass die CPU-Leistung besser wird, aber ich bin ein bisschen besorgt, dass dies die Reaktionsfähigkeit des Systems negativ beeinflussen wird.

Natürlich ist die richtige Antwort wahrscheinlich, dass wir unsere Architektur überdenken müssen, um die GIL zu berücksichtigen. Aber das ist nicht sofort machbar. Wie kann ich die geeignete Vorgehensweise kurzfristig bestimmen?

    
Jason Baker 24.08.2010, 17:55
quelle

1 Antwort

1

Als erstes würde ich sicherstellen, dass Sie die Threads ordnungsgemäß beenden. Es ist sehr schwierig herauszufinden, was genau mit Ihrer Beschreibung passiert, aber Sie verwenden das Wort "monoton", was bedeutet, dass die CPU-Nutzung zeitlich gebunden ist, anstatt zu laden.

Sie können sehr gut in Threading-Grenzen von Python einsteigen, aber es sollte mit Last (Anzahl der aktiven Threads) nach oben und unten variieren, und die CPU-Nutzung (Kontextwechselkosten) sollte sich verringern, wenn diese Threads beendet werden. Gibt es einen Grund dafür, dass ein einmal erstellter Thread für immer lebt? Wenn das der Fall ist, priorisieren Sie diese Architektur. Andernfalls wäre es kurzfristig, herauszufinden, warum die CPU-Nutzung zeitlich gebunden ist und nicht geladen wird. Es impliziert, dass jeder neue Thread einen permanenten, irreversiblen Kostenaufwand in Ihrem System hat - was bedeutet, dass er niemals beendet wird.

    
Joshua 25.08.2010 00:49
quelle

Tags und Links