Ordina - parallelo non sta parallelizzando


10

Sto cercando di rendere unico un insieme di linee estratte da un file con egrep con sort -u, quindi contarle. Circa il 10% delle righe (tutti i 100 caratteri dell'alfabeto [ATCG]) sono duplicati. Ci sono due file, circa 3 concerti ciascuno, il 50% non è rilevante, quindi forse 300 milioni di righe.

LC_ALL=C  grep -E  <files> |  sort --parallel=24  -u | wc -m

Tra LC_ALL = C e l'uso di -x per accelerare grep, la parte più lenta è di gran lunga l'ordinamento. Leggere le pagine man mi ha portato a --parallel = n, ma la sperimentazione non ha mostrato alcun miglioramento. Un piccolo scavo con top ha mostrato che anche con --parallel = 24, il processo di ordinamento viene eseguito su un solo processore alla volta.

Ho 4 chip con 6 core e 2 thread / core, per un totale di 48 processori logici. Vedi lscpu perché / proc / cpuinfo sarebbe troppo lungo.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             4
NUMA node(s):          8
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 1
Stepping:              2
CPU MHz:               1400.000
BogoMIPS:              5199.96

Cosa mi sto perdendo? Anche se il processo è associato a IO, non dovrei comunque vedere l'elaborazione parallela? Il processo di ordinamento utilizza il 99% del processore su cui è effettivamente acceso in qualsiasi momento, quindi dovrei essere in grado di vedere la parallelizzazione se sta accadendo. La memoria non è un problema, ho 256 Gb con cui giocare e nessuno di questi viene utilizzato da nessun altro.

Qualcosa che ho scoperto convogliare grep in un file, quindi leggere il file con ordinamento:

 LC_ALL=C  grep -E  <files>  > reads.txt ; sort reads.txt  -u | wc -m

default, file 1m 50s
--parallel=24, file 1m15s
--parallel=48, file 1m6s
--parallel=1, no file 10m53s
--parallel=2, no file 10m42s
--parallel=4 no file 10m56s

others still running

Nel fare questi benchmark è abbastanza chiaro che quando l'ordinamento dell'input convogliato non sta affatto parallelizzando. Quando è permesso leggere un ordinamento di file divide il carico come indicato.


Cos'è sortquello su quale distribuzione? Lo standard sortnon conosce questa opzione.
— ott--

uname -adà "3.13.0-46-generic # 79-Ubuntu SMP" e lsb_release -aafferma il nome in codice 14.04.2 fidato, e la versione di sorta che fa parte del coreutils gnu, secondo man sort.
— Jeremy Kemball,

Mi sembra che qui ci siano parti che devono essere rilette
— Hannu

Non sono sicuro di capire cosa stai ottenendo su @Hannu, potresti essere più specifico? sort --parallel = 2 non si parallelizza neanche. Né 4 né 8. nproc restituisce 48 come dovrebbe.
— Jeremy Kemball,

1
Direi ... non usare coreutils per questo. In modo divertente abbiamo avuto una domanda molto simile e bene ... ogni altro metodo funziona meglio superuser.com/a/485987/10165
— Journeyman Geek

Risposte:


24

sort non crea un thread a meno che non sia necessario e per i file di piccole dimensioni è solo un sovraccarico. Ora purtroppo l'ordinamento tratta una pipe come un piccolo file. Se si desidera fornire dati sufficienti a 24 thread, è necessario specificare l'ordinamento per utilizzare un buffer interno di grandi dimensioni (l'ordinamento lo fa automaticamente quando presentato con file di grandi dimensioni). Questo è qualcosa che dovremmo migliorare a monte (almeno nella documentazione). Quindi vorrai qualcosa di simile:

(export LC_ALL=C; grep -E  <files> | sort -S1G --parallel=24 -u | wc -m)

Nota Ho impostato LC_ALL = C per tutti i processi, poiché trarranno tutti vantaggio da questi dati).

A proposito, puoi monitorare i thread di ordinamento con qualcosa del tipo:

watch -n.1 ps -C sort -L -o pcpu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.