Paralléliser la compression de fichiers

Cela fait maintenant un certain temps que je suis dans la vie active et depuis mes débuts je n’ai plus vu d’amélioration foudroyante des processeurs. Ce que nous proposent maintenant les constructeurs, c’est de multiplier les coeurs. Toutefois pour profiter de cette explosion de capacité de calcul, il faut être capable de paralléliser les taches, ce qui n’est pas forcément chose aisée, mais le challenge est souvent très intéressant.
J’apprécie ainsi particulièrement les fonctionnalités de parallélisme de la base Oracle qui est capable de vraiment me bluffer en terme de performance tout en gardant une grande simplicité d’utilisation.
Un de mes soucis récemment était de pouvoir compresser un export datadump d’une taille certaine (120Go)  rapidement. J’ai ainsi découvert l’utilitaire pigz qui, comme son nom ne l’indique pas, est l’equivalent de gzip mais en mode multithreadé. Ainsi lancé sur une machine relativement costaude (16 coeurs), j’ai pu flasher la bête  dans une pointe à 1153% de CPU :

System: xxxxxxx Fri Apr 13 15:16:39 2012
Load averages: 1.81, 0.98, 0.47
1242 processes: 1110 sleeping, 123 running, 9 zombies
Cpu states:
CPU LOAD USER NICE SYS IDLE BLOCK SWAIT INTR SSYS
 0 1.86 58.7% 0.0% 3.9% 37.4% 0.0% 0.0% 0.0% 0.0%
 2 1.93 58.3% 0.0% 1.8% 40.0% 0.0% 0.0% 0.0% 0.0%
 4 1.97 59.1% 0.0% 2.7% 38.2% 0.0% 0.0% 0.0% 0.0%
 6 1.92 49.5% 0.0% 3.5% 47.0% 0.0% 0.0% 0.0% 0.0%
 8 1.78 62.2% 0.0% 4.7% 33.1% 0.0% 0.0% 0.0% 0.0%
10 1.93 61.8% 0.0% 8.0% 30.2% 0.0% 0.0% 0.0% 0.0%
12 1.79 50.9% 0.0% 13.8% 35.3% 0.0% 0.0% 0.0% 0.0%
14 1.81 66.7% 0.0% 4.7% 28.7% 0.0% 0.0% 0.0% 0.0%
16 1.65 71.0% 0.0% 0.4% 28.7% 0.0% 0.0% 0.0% 0.0%
18 1.80 69.0% 0.0% 1.6% 29.4% 0.0% 0.0% 0.0% 0.0%
20 1.72 67.8% 0.0% 1.6% 30.6% 0.0% 0.0% 0.0% 0.0%
22 1.72 68.6% 0.0% 1.4% 30.0% 0.0% 0.0% 0.0% 0.0%
24 1.65 61.8% 0.0% 2.1% 36.1% 0.0% 0.0% 0.0% 0.0%
26 1.77 47.8% 0.0% 6.6% 45.6% 0.0% 0.0% 0.0% 0.0%
28 1.89 54.4% 0.0% 5.8% 39.8% 0.0% 0.0% 0.0% 0.0%
30 1.71 69.6% 0.0% 2.5% 27.9% 0.0% 0.0% 0.0% 0.0%
--- ---- ----- ----- ----- ----- ----- ----- ----- -----
avg 1.81 61.1% 0.0% 4.1% 34.8% 0.0% 0.0% 0.0% 0.0%
System Page Size: 4Kbytes
Memory: 81413632K (42373640K) real, 90752372K (47641184K) virtual, 11170256K free Page# 1/38
CPU TTY PID USERNAME PRI NI SIZE RES STATE TIME %WCPU %CPU COMMAND
 2 pts/1 16308 oracle 152 20 32356K 21956K run 47:28 1153.95 1153.00 pigz
12 ? 12234 grid 178 20 2551M 5556K sleep 5:43 20.13 20.10 oracleXXXX1
14 ? 11907 grid 178 20 1902M 9108K sleep 96:32 19.96 19.93 oracleXXXX1
12 ? 5359 grid -1 20 238M 107M run 7506:06 9.79 9.77 ocssd.bin
 2 ? 104 root 152 20 76320K 67840K run 3868:24 4.83 4.82 vxfsd
 0 ? 5813 root 152 20 975M 723M run 2663:02 3.23 3.23 crsd.bin
18 ? 7846 oracle 178 20 2568M 21576K sleep 536:35 2.70 2.70 ora_lmd0_XXXX1
10 ? 8040 oracle 152 20 218M 34256K run 2917:48 2.53 2.53 oraagent.bin
 4 ? 28133 oracle 184 20 72K 64K zomb 0:00 2.09 2.09 auto_rem
12 ? 23518 oracle 152 20 213M 41708K run 2410:48 1.92 1.92 oraagent.bin
30 pts/2 16620 lmagallo 193 20 12312K 3124K run 0:05 1.87 1.87 top
 6 ? 5386 root 152 20 205M 20500K run 1683:33 1.87 1.87 orarootagent.bin
12 ? 5347 grid 152 20 173M 16660K run 1536:58 1.86 1.86 gipcd.bin
24 ? 3444 root 152 20 275M 33372K run 1223:45 1.69 1.69 ohasd.bin
 0 ? 2691 root -16 20 156M 128M run 1153:04 1.68 1.68 midaemon
16 ? 5390 root 152 20 157M 12868K run 1033:23 1.46 1.45 octssd.bin
14 ? 7971 oracle 178 20 2562M 13344K run 490:25 1.45 1.45 ora_lck0_XXXX1
28 ? 5400 grid 152 20 271M 13936K run 910:03 1.43 1.43 evmd.bin
10 ? 7836 oracle 178 20 2578M 24024K sleep 883:18 1.22 1.22 ora_dia0_XXXX1
24 ? 2661 oracle 178 20 25444M 10280K sleep 0:47 1.11 1.11 ora_s000_XXXX1

Les sources sont disponibles ici : http://zlib.net/pigz/. Vous pourrez trouver des binaires Linux RHEL, OEL et CENTOS sur repoforge.