PostgreSQL a priorita dotazů

Naše databázová aplikace obsahuje dva druhy akcí – "interaktivní" a "na pozadí". Interaktivní jsou takové akce, které vyvolal uživatel a čeká na jejich výsledek (např. výpis záznamů). Akce na pozadí jsou spouštěny automaticky a provádějí různé dlouhotrvající práce (např. přepočet aktuálních úroků pro nový den). Téměř všechny akce na pozadí spouštíme v noci a žádný uživatel nečeká na výsledek.

Někdy je třeba spustit akce na pozadí i v době, kdy je systém vytížen interaktivními akcemi. V takových případech se může stát, že se běh interaktivních akcí zpomalí.

Tento problém můžeme jednoduše vyřešit vhodným nastavením priorit pro operační systém a využívat tak procesor a případně i IO aktivitu (přístup k disku) jen tehdy, nevyužívá-li je právě žádná interktivní akce.

Naše aplikace je složena z java programu a databáze. Musím poznamenat, že jak akce interaktivní tak akce na pozadí sdílejí stejnou databázi i stejný virtuální stroj (JVM).

Prioritu vlákna v javě snížíme takto:

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

Informace o implementaci vláken v JDK 5.0 najdete na stránkách Sunu.

Snížit prioritu určitého spojení PostgreSQL ovšem neumí. Proto si musíme pomoci vlastní funkcí.

CREATE FUNCTION setpriority (int4,int4,int4) RETURNS int4 AS '/lib/libc.so.6', 'setpriority' LANGUAGE 'C' ;

Pozn.: tato funkce bude fungovat jen na unixových systémech.

Využijeme implementaci funkce setpriority v knihovně libc.

Nyní stačí pouze zavolat:

select setpriority(0,0,19);

Prioritu již nelze vrátit zpět na vyšší. Snížení priority se aplikuje jen na konkrétní vlákno/spojení. Pokud používáte tzv. connection pooling, potom je třeba spojení „zlikvidovat“ a nevracet zpět. Hrozí totiž, že by prioritu mohla převzít i interaktivní akce.

Poznámka: prioritizování IO mají systémy FreeBSD a Linux až od verze 2.6 – záleží ovšem na zvoleném IO elevatoru.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *