Translate

lunes, 11 de junio de 2018

Caché de /etc/hosts mediante NSCD - Name Service Cache Daemon

nscd  - Name Service Cache Daemon, es un programa que permite acelerar el proceso de resolución de nombres de usuarios, grupos, hosts, etc. La idea es que si hay muchos usuarios o hosts que estén dados de alta en el sistema, la búsqueda de estos sea lo más rápido posible la siguiente vez que se acceda  a estos.
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
 yum -y install nscd

  • Activación de nscd cuando arranque el sistema operativo:
chkconfig nscd on

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: