Introducción
Muchas veces para poder realizar pruebas de rendimiento necesitamos tener archivo con tamaños concretos, por ejemplo para
medir la latencia de nuestros servidores Apache HTTP con JMeter.
Para ello, podemos utilizar varios comandos, aunque yo principalmente utilizo dos: <dd> y <mkfile>.
Vamos a crear un archivo de <8Mb> utilizando primero <dd> y luego <mkfile>. El formato del comando <dd> es el siguiente:
dd if={device_origen} of={destino} bs={tamaño de bloque} count={número de veces}
Por lo tanto, si queremos crear un archivo de 8Mb, podemos tener un BlockSize (bs) de 8k y realizar la operación 1024 veces. Vamos a utilizar el
device </dev/zero> que nos va a crear un archivo lleno de "ceros".
# time dd if=/dev/zero of=test.dd bs=8k count=1024
1024+0 registros dentro
1024+0 registros fuera
real 0m0.082s
user 0m0.006s
sys 0m0.043s
Pero si queremos que
esté lleno de contenido variable podemos utilizar el
device </dev/random> para que nos generes secuencias pseudo aleatorias, por ejemplo,
# time dd if=/dev/random of=test.dd_random count=1024
0+1024 registros dentro
0+1024 registros fuera
real 1m52.687s
user 0m0.012s
sys 1m50.498s
Podemos comprobar con un visor octal <od> como al crear el archivo con el
device </dev/zero> está lleno de ceros -como es lógico- pero, cuando hacemos lo mismo con el archivo creado utilizando el device </dev/radom> nos ha creado un archivo completamente distinto.
Esto será muy importante cuando utilicemos servicios de compresión -
por ejemplo mod_gzip, mod_defalte- ya que comprimirá prácticamente al 99% el archivo creado con </dev/zero> haciéndonos creer que el rendimiento será muy superior al real.
# od -c test.dd
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
40000000
# od -c test.ddrandom |head -3
0000000 017 260 Ò - ; Ð Ã ¿ x N < 230 ü 217 a e
0000020 O æ 254 k û ö c 4 û 257 - Ã { þ 271
0000040 Æ Ù l 243 Ü ê å å ] 217 f > l C É q
Y si comprimimos los archivos utilizando <gzip> y su máxima compresión <-9>, veremos lo que os he comentado,
# ls -l
total 2048
-rw-r--r-- 1 root root 524288 may 20 11:42 test.dd
-rw-r--r-- 1 root root 524288 may 20 11:13 test.ddrandom
# gzip -9 test.ddrandom
# gzip -9 test.dd
# ls -l
total 1056
-rw-r--r-- 1 root root 551 may 20 11:42 test.dd.gz
-rw-r--r-- 1 root root 524400 may 20 11:13 test.ddrandom.gz
Como vemos, el archivo que hemos creado utilizando <dd if=/dev/zero> comprimido tiene un tamaño de 551 bytes y el creado con <dd if=/dev/random> no solo no ha sido comprimido, sino que ha aumentado de tamaño -por las cabeceras de GZIP-
Por el contrario, si no tenemos intención de utilizar sistemas de compresión, o queremos hacer métricas de uso de disco, podemos utilizar el comando <mkfile> con el siguiente formato
mkfile {tamaño}{unidad} {nombre archivo}
Donde
unidad será
k para Kb,
m para Mb. Por ejemplo, para crear el mismo archivo de 8Mb, utilizaremos el siguiente comando.
# time mkfile 8m test.mkfile
real 0m0.049s
user 0m0.003s
sys 0m0.037s
# od -c test.mkfile
0000000 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
*
40000000
Como vemos, <mkfile> genera un archivo utilizando como
device </dev/zero> al igual que <dd> pero de una forma más sencilla
Referencias