Hoje eu comecei a configurar dois Dell PowerEdge 840 com 4 discos de 1 TB cada. Esses serão os meus novos servidores de backup aqui no trabalho. Estou usando DRBD para fazer com que o segundo seja o espelho do primeiro (RAID 1 over TCP/IP). Criei uma partição de 15 GB para receber o Debian Lenny e uni o resto do primeiro disco com os outros com LVM.
O problema ocorreu quando eu instalei e configurei o DRBD. Ao dar start, vejam a mensagem de erro:
gramado:/# /etc/init.d/drbd start
Starting DRBD resources: [ d(backup) /dev/drbd0: Failure: (140) vmalloc() failed. Out of memory?[backup] cmd /sbin/drbdsetup /dev/drbd0 disk /dev/gramado/backup /dev/gramado/backup internal –set-defaults –create-device failed – continuing!
n(backup) ].
gramado:/#
Bem, o problema parece claro: vmalloc() failed. É o seguinte (resumo): o kernel pode alocar espaço para uso na memória física ou na virtual. Para a memória física ele usa kmalloc. Para memória virtual (RAM + swap) ele usa vmalloc. A literatura especializada diz que é raro usar vmalloc. No entanto, encontrei isto:
kmalloc is limited in the size of buffer it can provide: 128 KBytes. If you need a really big buffer, you have to use vmalloc or some other mechanism like reserving high memory at boot.
Fonte: STACK OVERFLOW. What is the difference between vmalloc and kmalloc?. Disponível em http://stackoverflow.com/questions/116343/what-is-the-difference-between-vmalloc-and-kmalloc. Acesso em 14 jul. 09.
No caso do meu problema com o DRBD, dei uma olhada no vmalloc com o comando # cat /proc/meminfo. No resultado, observei o seguinte:
VmallocTotal: 114680 kB
VmallocUsed: 2344 kB
VmallocChunk: 111928 kB
Conclusão: se tinha cerca de 112 MB e ele só usou 2.3 MB e ainda disse que faltou memória, então 112 MB era pouco. Agora, como fazer para aumentar o vmalloc? Uma rápida olhadinha no Google mostrou como. É só editar o menu.lst do GRUB. No meu caso, a linha referente ao kernel que estou usando ficou assim (para 160 MB de vmalloc):
kernel /boot/vmlinuz-2.6.26-2-686 root=/dev/sda1 ro quiet vmalloc=160m
É isso. Problema resolvido. Veja:
gramado:~# cat /proc/meminfo
…
VmallocTotal: 147448 kB
VmallocUsed: 121272 kB
VmallocChunk: 25844 kBgramado:~# /etc/init.d/drbd start
Starting DRBD resources: [ d(backup) n(backup) ].
gramado:~#