Lors du Fosdem 2009, j’ai fait face à un contributeur d’une distribution binaire – que je ne citerai pas (je ne me souviens pas si c’est OpenSUSE ou Fedora).

J’ai alors dû lui expliquer en quoi Gentoo Linux, et ses USE flags apportait une puissance incomparable face à une distribution binaire ; je vous explique :

La majorité des logiciels opensource (Apache, PHP, MySQL, …)

proposent d’activer ou de désactiver des fonctionnalités (support de tel ou tel protocole, extension, etc…) ; Dans la plupart des cas, ces fonctionnalités sont contrôlées par des options
de compilation
qui vont permettre de générer des binaires contenant ce qui a été activé, et excluant ce qui a été désactivé.

Cette dernière phrase peut paraître « plus que logique » après lecture, mais c’est là tout l’interêt de Gentoo Linux, puisque, lors de l’installation de chaque

logiciel, vous allez pouvoir sans difficulté activer/désactiver les fonctionnalités de votre choix. Vous obtiendrez donc un binaire qui ne contient ni plus ni moins de traitement qu’il en sera nécessaire.

Cette flexibilité n’existe pas dans les distributions binaires, puisque, avant que vous décidiez d’installer un programme, les options de compilation ont déjà étés choisies par l’éditeur de votre distribution ; et cela, en fonction de ce que eux ont considéré comme « configuration adéquate ».

Certains diront qu’il existe, pour certains logiciels, plusieurs « paquets », exemple : apache et apache-ssl (respectivement Apache sans, et avec le support SSL) ; seulement en y réfléchissant, on se rend compte que si il existe deux paquets pour un logiciel, il existe bien plus d’options de compilation (correspondant à des fonctionnalités)…

D’autres rajouteront que, sous Debian par exemple, il reste relativement « simple » de générer de nouveaux paquets avec les options de notre choix, mais là aussi, il s’agit d’une possibilité nécessitant des compétences supplémentaires, et non d’un choix « natif » lors de l’installation du programme.

Ne serait-il pas plus logique de prendre l’habitude, d’avoir le choix à chaque fois ? et donc d’avoir des systèmes adaptés/sur mesure ?

Nous vous précisons – bien que ce ne soit pas l’objet de cet article – que sous Gentoo, les USE flags peuvent êtres définis via :

  • la variable d’environnement USE – méthode sale_mais_qui_marche(tm)
  • le fichier /etc/portage/package.use – méthode conseillée

Tests avec dev-lang/php-5.2.8-r2

Afin de faire ressortir l’interêt de tout cela, nous avons fait un bench avec PHP en CLI.

Nous avons alors des dizaines de fonctionnalités; le bench fait ressortir :

  • le temps de compilation (pour informations uniquement)
  • le temps d’exécution de la commande « php -v » (100 000 fois)
  • le temps d’exécution de la fonction « phpinfo(); » (100 000 fois)

Pour les impatients, voici le résultat des tests, pour plus d’informations, allez plus bas.

Temps de compilation 100’000 fois php -v 100’000 fois phpinfo()
Cas 1 108 s 225 s 256 s
Cas 2 127 s 340 s 357 s
Cas 3 129 s 3’159 s 3’175 s
Cas 4 164 s 3’835 s 3’854 s
Cas 5 188 s 4’514 s 4’532 s
Cas 6 194 s 4’549 s 4’564 s

On constate clairement, qu’entre le cas 2 et cas 3 (où seul le useflag snmp est ajouté) la différence est incroyable.

Imaginez donc l’impact de ce type de différence avec PHP en CGI ou même en mod_php…

Le script bench-php-use-flags.sh

{literal}

#!/bin/bash
echo -n "${useflag}">>phplog
function testit()
{
        useflag=$1
        export USE="${useflag}"
        echo "${useflag}">>phplog
        echo "">>phplog
        emstart=`date +%s`
        emerge dev-lang/php >/dev/null 2>&1
        emend=`date +%s`
        emlg=$((${emend}-${emstart}))
        echo "Compile time : ${emlg}">>phplog
        emstart=`date +%s`
        for I in `seq 1 100000`; do
                /usr/bin/php -v >/dev/null 2>&1
        done
        emend=`date +%s`
        emlg=$((${emend}-${emstart}))
        echo "php -v time : ${emlg}">>phplog
        emstart=`date +%s`
        for I in `seq 1 100000`; do
                echo "" | /usr/bin/php >/dev/null 2>&1
        done
        emend=`date +%s`
        emlg=$((${emend}-${emstart}))
        echo "phpinfo()  time : ${emlg}">>phplog
        unset USE
        echo "">>phplog
        echo "">>phplog
        echo "==============================================">>phplog
}
testit "cli -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -crypt -ctype -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -iconv -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysql -mysqli -ncurses -nls -oci8 -oci8-instant-client -odbc -pcntl -pcre -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -session -sharedext -sharedmem -simplexml -snmp -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -unicode -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib"
testit "cli crypt ctype iconv mysql nls pcre session unicode -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -ncurses -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -sharedext -sharedmem -simplexml -snmp -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib"
testit "cli crypt ctype iconv mysql nls pcre session snmp unicode -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -ncurses -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -sharedext -sharedmem -simplexml -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib"
testit "-adabas bcmath berkdb -birdstep bzip2 calendar cdb cjk cli crypt ctype curl -db2 dbase -dbmaker exif filter ftp gd gdbm iconv imap ipv6 mysql ncurses nls pcre readline reflection session snmp spl ssl truetype unicode xml zlib -apache2 -cgi -concurrentmodphp -curlwrappers -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -hash -inifile -interbase -iodbc -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -recode -sapdb -sharedext -sharedmem -simplexml -soap -sockets -solid -spell -sqlite -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -wddx -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external"
testit "bcmath berkdb bzip2 calendar cdb cjk cli crypt ctype curl dbase exif filter ftp gd gdbm iconv imap ipv6 json mhash mysql mysqli ncurses nls pcre pdo posix readline reflection session simplexml snmp soap sockets spell spl sqlite ssl tidy truetype unicode xml xmlreader xmlrpc xmlwriter xsl zlib -adabas -apache2 -birdstep -cgi -concurrentmodphp -curlwrappers -db2 -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -hash -inifile -interbase -iodbc -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -msql -mssql -oci8 -oci8-instant-client -odbc -pcntl -pic -postgres -qdbm -recode -sapdb -sharedext -sharedmem -solid -suhosin -sybase -sybase-ct -sysvipc -threads -tokenizer -wddx -xpm -yaz -zip -zip-external"
testit "bcmath berkdb bzip2 calendar cdb cjk cli crypt ctype curl dbase exif filter ftp gd gdbm hash iconv imap inifile ipv6 json ldap mhash mysql mysqli ncurses nls pcntl pcre pdo posix readline reflection session simplexml snmp soap sockets spell spl sqlite ssl tidy truetype unicode xml xmlreader xmlrpc xmlwriter xsl zlib -adabas -apache2 -birdstep -cgi -concurrentmodphp -curlwrappers -db2 -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -interbase -iodbc -kerberos -kolab -ldap-sasl -libedit -mcve -msql -mssql -oci8 -oci8-instant-client -odbc -pic -postgres -qdbm -recode -sapdb -sharedext -sharedmem -solid -suhosin -sybase -sybase-ct -sysvipc -threads -tokenizer -wddx -xpm -yaz -zip -zip-external"
  

{/literal}

Voici l’output du script bench-php-use-flags.sh :

cli -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -crypt -ctype -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -iconv -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysql -mysqli -ncurses -nls -oci8 -oci8-instant-client -odbc -pcntl -pcre -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -session -sharedext -sharedmem -simplexml -snmp -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -unicode -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib

Compile time : 108

php -v time : 225

phpinfo() time : 256

==============================================

cli crypt ctype iconv mysql nls pcre session unicode -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -ncurses -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -sharedext -sharedmem -simplexml -snmp -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib

Compile time : 127

php -v time : 340

phpinfo() time : 367

==============================================

cli crypt ctype iconv mysql nls pcre session snmp unicode -adabas -apache2 -bcmath -berkdb -birdstep -bzip2 -calendar -cdb -cgi -cjk -concurrentmodphp -curl -curlwrappers -db2 -dbase -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -exif -fastbuild -fdftk -filter -firebird -flatfile -force-cgi-redirect -frontbase -ftp -gd -gd-external -gdbm -gmp -hash -imap -inifile -interbase -iodbc -ipv6 -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -ncurses -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -readline -recode -reflection -sapdb -sharedext -sharedmem -simplexml -soap -sockets -solid -spell -spl -sqlite -ssl -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -truetype -wddx -xml -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external -zlib

Compile time : 129

php -v time : 3159

phpinfo() time : 3175

==============================================

-adabas bcmath berkdb -birdstep bzip2 calendar cdb cjk cli crypt ctype curl -db2 dbase -dbmaker exif filter ftp gd gdbm iconv imap ipv6 mysql ncurses nls pcre readline reflection session snmp spl ssl truetype unicode xml zlib -apache2 -cgi -concurrentmodphp -curlwrappers -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -hash -inifile -interbase -iodbc -json -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -mhash -msql -mssql -mysqli -oci8 -oci8-instant-client -odbc -pcntl -pdo -pic -posix -postgres -qdbm -recode -sapdb -sharedext -sharedmem -simplexml -soap -sockets -solid -spell -sqlite -suhosin -sybase -sybase-ct -sysvipc -threads -tidy -tokenizer -wddx -xmlreader -xmlrpc -xmlwriter -xpm -xsl -yaz -zip -zip-external

Compile time : 164

php -v time : 3835

phpinfo() time : 3854

==============================================

bcmath berkdb bzip2 calendar cdb cjk cli crypt ctype curl dbase exif filter ftp gd gdbm iconv imap ipv6 json mhash mysql mysqli ncurses nls pcre pdo posix readline reflection session simplexml snmp soap sockets spell spl sqlite ssl tidy truetype unicode xml xmlreader xmlrpc xmlwriter xsl zlib -adabas -apache2 -birdstep -cgi -concurrentmodphp -curlwrappers -db2 -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -hash -inifile -interbase -iodbc -kerberos -kolab -ldap -ldap-sasl -libedit -mcve -msql -mssql -oci8 -oci8-instant-client -odbc -pcntl -pic -postgres -qdbm -recode -sapdb -sharedext -sharedmem -solid -suhosin -sybase -sybase-ct -sysvipc -threads -tokenizer -wddx -xpm -yaz -zip -zip-external

Compile time : 188

php -v time : 4514

phpinfo() time : 4532

==============================================

bcmath berkdb bzip2 calendar cdb cjk cli crypt ctype curl dbase exif filter ftp gd gdbm hash iconv imap inifile ipv6 json ldap mhash mysql mysqli ncurses nls pcntl pcre pdo posix readline reflection session simplexml snmp soap sockets spell spl sqlite ssl tidy truetype unicode xml xmlreader xmlrpc xmlwriter xsl zlib -adabas -apache2 -birdstep -cgi -concurrentmodphp -curlwrappers -db2 -dbmaker -debug -discard-path -doc -empress -empress-bcs -esoob -fastbuild -fdftk -firebird -flatfile -force-cgi-redirect -frontbase -gd-external -gmp -interbase -iodbc -kerberos -kolab -ldap-sasl -libedit -mcve -msql -mssql -oci8 -oci8-instant-client -odbc -pic -postgres -qdbm -recode -sapdb -sharedext -sharedmem -solid -suhosin -sybase -sybase-ct -sysvipc -threads -tokenizer -wddx -xpm -yaz -zip -zip-external

Compile time : 194

php -v time : 4549

phpinfo() time : 4564