En este caso, puede ser útil cuando se tienen muchas entradas en el archivo /etc/hosts.
El archivo /etc/hosts se usa a menudo para identificar máquinas que no necesariamente deben tener un dominio. A diferencia de este, el sistema de DNS sí necesita establecer los dominios y que los hosts queden en algún dominio.
El /etc/hosts es empleado a menudo para identificar nombres servicios locales, alias, etc. Lo interesante es que este archivo en Linux puede tener cualquier tamaño dentro de los límites que establece el sistema de archivos. Por ejemplo, en ext4 el tamaño máximo es de 16 TB.
La resolución mediante /etc/hosts se hace con una búsqueda lineal, pero esta se puede acelerar si se guarda en caché mediante el servicio nscd.
Ejemplo de instalación de nscd y pruebas de resolución con /etc/hosts:
- Instalación de nscd
- Activación de nscd cuando arranque el sistema operativo:
Por el momento no lo arrancamos para verificar el tiempo de resolución de nombres con 16 millones de hosts y cuánto se tarda sin caché y con caché.
Script creahosts para crear alrededor de 16 millones de hosts:
#!/bin/bash
max=$(( 256*256*256 ))
for (( i=0; $i<$max; i++ )); do
byte4=$(( $i%256 ))
byte3=$(( $i/256 )) ; byte3=$(( $byte3%256 ))
byte2=$(( $i/65536 )); byte2=$(( $byte2%256 ))
printf "10.$byte2.$byte3.$byte4 a%08d\n" $i ;
done
Guardamos el archivo y le ponemos permisos de ejecución:
chmod a+x creahosts
Ejecutamos el script enviando la salida al archivo hosts.new
Nota: este proceso puede tardar decenas de minutos como se muestra en este ejemplo donde se ejecutó con el comando time. Esto se hizo en una máquina virtual de 1 núcleo Intel(R) Xeon(R) CPU E5-2430 0 @ 2.20GHz, con 1 GB en RAM y más de 3 GB disponibles en disco duro:
time creahosts > hosts.new
real 36m24.303s
user 24m16.402s
sys 5m0.305s
El archivo hosts.new creado tiene más de 16 millones de lineas y ocupa más de 360 MB :
[root@localhost etc]# wc hosts.new
16777216 33554432 386693520 hosts.new
[root@localhost etc]# ls -lh hosts.new
-rw-r--r--. 1 root root 369M Jun 7 18:39 hosts.new
Se lo agregamos al archivo /etc/hosts:
cat hosts.new >> /etc/hosts
Y verificamos algunas lineas del principio y del fin:
[root@localhost etc]# head /etc/hosts
127.0.0.1 localhost.localdomain localhost
::1 localhost6.localdomain6 localhost6
10.0.0.0 a00000000
10.0.0.1 a00000001
10.0.0.2 a00000002
10.0.0.3 a00000003
10.0.0.4 a00000004
10.0.0.5 a00000005
10.0.0.6 a00000006
10.0.0.7 a00000007
[root@localhost etc]# tail /etc/hosts
10.255.255.246 a16777206
10.255.255.247 a16777207
10.255.255.248 a16777208
10.255.255.249 a16777209
10.255.255.250 a16777210
10.255.255.251 a16777211
10.255.255.252 a16777212
10.255.255.253 a16777213
10.255.255.254 a16777214
10.255.255.255 a16777215
- Medimos el tiempo de respuesta de resolución sin el nscd activo:
[root@localhost etc]# service nscd stop
[root@localhost etc]# service nscd status
nscd is stopped
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4
real 0m3.458s
user 0m3.052s
sys 0m0.342s
10.255.255.250
real 0m3.488s
user 0m3.153s
sys 0m0.307s
Incluso al repetir los comandos salen tiempos similares.
Probamos ahora con el nscd:
[root@localhost etc]# service nscd start
Starting nscd: [ OK ]
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4
real 0m3.336s
user 0m0.000s
sys 0m0.003s
10.255.255.250
real 0m3.173s
user 0m0.000s
sys 0m0.001s
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4
real 0m0.006s
user 0m0.000s
sys 0m0.001s
10.255.255.250
real 0m0.005s
user 0m0.000s
sys 0m0.001s
Al repetir el tiempo se reduce notoriamente. Lo mismo ocurre con hostnames inexistentes:
[root@localhost etc]# time gethostip -d noexiste1; time gethostip -d noexiste2
noexiste1: Unknown host
real 0m3.427s
user 0m0.002s
sys 0m0.001s
noexiste2: Unknown host
real 0m3.368s
user 0m0.000s
sys 0m0.001s
[root@localhost etc]# time gethostip -d noexiste1; time gethostip -d noexiste2
noexiste1: Unknown host
real 0m0.003s
user 0m0.000s
sys 0m0.001s
noexiste2: Unknown host
real 0m0.002s
user 0m0.001s
sys 0m0.001s
[root@localhost etc]#
El tiempo que queda en cache está definido en /etc/nscd.conf. Así que lo modificamos si deseamos que sea permanente ponemos:
positive-time-to-live hosts 0 #Permanente
negative-time-to-live hosts 86400 #1 day
Y reiniciamos para que tome los cambios:
[root@localhost etc]# service nscd restart
Stopping nscd: [ OK ]
Starting nscd: [ OK ]
Probamos:
[root@localhost etc]# time gethostip -d a00000004; time gethostip -d a16777210
10.0.0.4
real 0m0.008s
user 0m0.001s
sys 0m0.001s
10.255.255.250
real 0m0.012s
user 0m0.000s
sys 0m0.001s
[root@localhost etc]# time gethostip -d a12345678; time gethostip -d a12345678
10.188.97.78
real 0m3.369s
user 0m0.000s
sys 0m0.002s
10.188.97.78
real 0m0.002s
user 0m0.000s
sys 0m0.002s
No hay comentarios:
Publicar un comentario