2010-08-24 5 views
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 etwas blockiert werden muss und asynchrone Treiber nicht verfügbar sind, wird ein anderer Thread erzeugt, um die Blockierung durchzuführen.Wie ermittle ich das passende Prüfintervall?

So haben wir den Haupt-Thread fast vollständig CPU-gebunden und eine Reihe 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 eine Menge Zeit damit verbringen, auf Signale zu warten (was ich annehme, was __semwait_signal tut), was mit den Auswirkungen übereinstimmt, die die GIL in meinem begrenzten Verständnis haben würde.

Wenn ich sys.setcheckinterval verwenden, um das Prüfintervall auf 300 festzulegen, 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 etwas 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 bestimme ich die geeigneten Maßnahmen, die ich kurzfristig ergreifen kann?

Antwort

1

Das erste, was ich überprüfen würde, wäre sicherzustellen, dass Sie Thread 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 laufen, aber es sollte variieren mit Last (Anzahl der aktiven Threads) und CPU-Auslastung (Kontextwechsel Kosten) sollte reduzieren, wie diese Threads beenden. 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.

+0

Ich bin sicher, dass Threads ordnungsgemäß beendet werden. Außerdem sehe ich unter Last einen Leistungsunterschied. Es ist nur so, dass die Last die CPU-Zeit schneller wachsen lässt. –