Johdanto
Kun Snakemakella ajetaan laskennallisesti raskaita työnkulkuja, voi käydä niin, että rinnakkain ajetaan liian monta työtä, mikä aiheuttaa liiallista I/O-kuormaa, muistipainetta tai suurta viivettä kiintolevyllä. Tämä voi johtaa epäonnistuneisiin töihin tai heikkoon suorituskykyyn.
Snakemake tarjoaa resources-direktiivin avulla tavan rajoittaa rinnakkaisuutta sääntökohtaisesti, mutta se toimii vain, jos työnkulkua ajettaessa annetaan myös globaali resurssiraja.
Tässä kirjoituksessa näytän, miten tietyn säännön rinnakkaisten töiden määrä rajoitetaan oikein Snakemaken resurssienhallinnan avulla.
Ongelma: liian monta työtä kerralla
Tarkastellaan seuraavaa Snakemake-sääntöä:
rule process_data:
input:
"{sample}.raw"
output:
"{sample}.processed"
resources:
process_data_jobs=1 # Assign a resource unit for limiting the number of jobs
shell:
"""
some_tool --input {input} --output {output}
"""
Miksi pelkkä resources ei rajoita töiden suorittamista?
Voisi olettaa, että resources: processing_jobs=1 rajoittaisi Snakemaken automaattisesti ajamaan yhden työn kerrallaan. Snakemake ei kuitenkaan aikatauluta resurssien mukaan, ellei työnkulkua käynnistettäessä anneta globaalia rajaa.
Ilman globaalia rajaa Snakemake voi silti käynnistää liian monta työtä rinnakkain ja kuormittaa järjestelmää liikaa.
Ratkaisu: resurssirajojen pakottaminen
Rinnakkaisten töiden määrän rajoittamiseksi Snakemake ajetaan näin:
snakemake --resources process_data_jobs=10
Miten tämä toimii?
- Jokainen
process_data-työ pyytää 1 yksikön resurssiaprocess_data_jobs. - Globaali raja
processing_jobs=10varmistaa, että rinnakkain ajetaan enintään 10 työtä (10 / 1 = 10). Halutessaan yksiköt voi asettaa toisinkin
Ennen rajan asettamista kerralla saattoi olla käynnissä aivan liian monta työtä! Sen jälkeen rinnakkain sai ajaa vain 10 työtä.
Yhteenveto
Jos Snakemakessa on ongelmana suuri levyviive, I/O-kuorma tai liian monta samanaikaista työtä, sen saa parhaiten hallintaan:
- määrittelemällä työkohtaiset resurssitarpeet
resources-direktiivillä - asettamalla Snakemakea ajettaessa globaalin resurssirajan (
--resources processing_jobs=10).
Näin työnkulku toimii tehokkaasti ja luotettavasti kuormittamatta järjestelmää liikaa!
