pawelko.net

  1. Accueil
  2. Linux

Tuning zfs-fuse sur Debian Squeeze

Le 02-12-11 à 11:11 , par Cyril PawelkoPermalien.
dans Linux and Accueil.

Je souhaite conserver plein de copies de sauvegarde de machines virtuelles tournant sur mon hyperviseur étant un kvm/libvirt/archipel sur une squeeze. Il y a un candidat idéal pour cela: zfs, qui pour des raisons de licence n'a pas d'implémentation native dans linux. Pour commencer, j'ai fait quelques tests avec zfs-fuse (0.6.9-1), sans tuning particulier. Ca marche correctement, mais pas très vite (moins de 10 Mo/s). J'ai ensuite utilisé le zfs natif. Les performances brutes étaient bien meilleures mais ça tirait énormément sur la RAM et tout finissait par devenir très lent, et la sauvegarde d'une des VM ne se terminait jamais. En essayant de tuner la taille du ARC cache, je n'ai réussi qu'à obtenir un plantage complet du noyau (le dmesg parlait de lui même).

Je suis donc retourné à zfs-fuse en attendant de trouver mieux. Maintenant que j'ai une rotation des VM sur une semaine, je peux avoir une idée précise des ressources requises par la déduplication:


#  zpool status -D zpool
 pool: zpool
state: ONLINE
scrub: none requested
config:

       NAME                               STATE     READ WRITE CKSUM
       zpool                              ONLINE       0     0     0
         disk/by-id/dm-name-archipel-zfs  ONLINE       0     0     0

errors: No known data errors

DDT entries 282985, size 354 on disk, 222 in core

bucket              allocated                       referenced
      __
refcnt   blocks   LSIZE   PSIZE   DSIZE   blocks   LSIZE   PSIZE   DSIZE
------   ------   -----   -----   -----   ------   -----   -----   -----
    1    49,6K   6,20G   2,25G   2,25G    49,6K   6,20G   2,25G   2,25G
    2    11,1K   1,39G    583M    583M    27,6K   3,45G   1,42G   1,42G
    4     171K   21,4G   12,6G   12,6G    1,13M    145G   85,5G   85,5G
    8    43,7K   5,46G   3,11G   3,11G     358K   44,7G   25,4G   25,4G
   16      741   92,6M   59,3M   59,3M    13,5K   1,69G   1,04G   1,04G
   32      129   16,1M   8,19M   8,19M    4,67K    598M    298M    298M
   64        3    384K   67,5K   67,5K      330   41,2M   7,78M   7,78M
  128        1    128K   4,50K   4,50K      133   16,6M    598K    598K
   1K        1    128K   4,50K   4,50K    1,27K    162M   5,71M   5,71M
   2K        1    128K      7K      7K    3,98K    509M   27,8M   27,8M
  16K        1    128K   7,50K   7,50K    23,7K   2,96G    178M    178M
Total     276K   34,5G   18,6G   18,6G    1,60M    205G    116G    116G

Je vois ici que j'ai 282985 entrées pour la déduplication, chaque entrée occupant 222 octets en RAM. J'en déduis donc que mon cache pour la dédup est d'environ 60 Mo (ce qui est peu !). Par défaut ZFS alloue un quart de la taille du cache ARC pour le cache des metadata, donc fait partie la table DDT. Le cache ARC doit donc être au moins de 240 Mo. Par défaut, la valeur sur ma Debian était de 100 Mo. Cela apparait au démarrage de fuse:

# grep -i zfs /var/log/syslog
Nov 28 21:12:39 archipel zfs-fuse: ARC caching: maximum ARC size: 100 MiB
Nov 28 21:12:39 archipel zfs-fuse: ARC setup: min ARC size set to 16777216 bytes
Nov 28 21:12:39 archipel zfs-fuse: ARC setup: max ARC size set to 104857600 bytes

J'ai donc modifié la ligne "max-arc-size = 240" dans le fichier /etc/zfs/zfsrc et relancé zfs-fuse

#invoke-rc.d zfs-fuse restart

A titre d'exemple, le temps de sauvegarde de ma VM zimbra est passé de 16 minutes à 6 minutes ! En réglant le cache à 500 Mo, je descends à 3 minutes pour la même sauvegarde. Ce qui correspond à peu près aux temps que j'obtenais avec les modules zfs natifs, mais qui eux provoquaient de nombreux plantages, alors qu'avec zfs-fuse j'ai une solution parfaitement stable. Un réglage du cache à 1 Go n'a pas donné de meilleurs résultats.

Conclusion : Voici la formule appliquée dans mon cas avec zfs-fuse : max-arc-size = Taille du cache DDT * 8

Vmware Server, NAT et PPTP

Le 02-08-10 à 21:50 , par Cyril PawelkoPermalien.
dans Linux and Accueil.

L'objectif

Un ami m'a soumis la problématique suivante: Il souhaite louer un serveur hébergé chez OVH (donc avec une seule interface réseau) avec vmware server pour héberger plusieurs machines virtuelles, dont une devant faire office de serveur pptp. Il comptait s'appuyer sur le "NAT Networking" de vmware server pour gérer la translation d'adresses, ce qui ne pose pas de problèmes pour le port TCP/1723 (PPTP) mais ne fonctionne pas avec le protocole 47 (GRE).
La solution est simple: Linux sachant parfaitement remplir ce rôle, il suffit de lui confier et de reléguer le "vm network" sur une interface virtuelle.

Voici donc un guide pas à pas concernant vmware server 2.0 sur une Debian 5.0.2.
Les paramètres sont les suivants:

  • IP "publique" de l'hôte: 192.168.3.1 (oui je sais, c'est une maquette)
  • Réseau privé: 172.16.0.0/24
  • IP privée de l'hôte: 172.16.0.1
  • IP serveur virtuel PPTP: 172.16.0.2

Ajout de l'interface virtuelle tap1

Installer le paquet contenant le binaire tunctl

apt-get install uml-utilities

Ajouter dans /etc/network/interfaces:

auto tap1
iface tap1 inet static
       pre-up tunctl -u root -t tap1
       pre-up ifconfig tap1 up
       post-down tunctl -d tap1
       address 172.16.0.1
       netmask 255.255.255.0

puis activer tap1

ifup tap1

vérifier le tout

#ifconfig tap1
tap1      Link encap:Ethernet  HWaddr 00:ff:c0:7f:c8:83
          inet adr:172.16.0.1  Bcast:172.16.0.255  Masque:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:3805 overruns:0 carrier:0
          collisions:0 lg file transmission:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Configuration vmware

Nous avons donc une nouvelle interface réseau, nous allons maintenant dire à vmware server de se "bridger" sur cette interface, et non pas une autre. Pour cela, lancer la commande

vmware-config.pl

et modifier la partie concernant les bridges, soit en ajoutant un nouveau brigde, soit en modifiant le bridge actuel pour qu'il utilise tap1. Dans notre cas, la deuxième solution semble la plus appropriée, les vm n'ayant plus à être connectées directements via l'interface "publique".
Les machines virtuelles peut maintenant être connectées à ce bridge, et se voir affecter une adresse IP en 172.16.0.x avec comme passerelle 172.16.0.1

Configuration iptables

Désormais, il n'y a plus qu'à paramétrer netfilter afin qu'il route correctement les paquets pptp. Tout d'abord on active le routage:

echo 1 > /proc/sys/net/ipv4/ip_forward

Puis on natte le réseau privé:

iptables -t nat -A POSTROUTING -s 172.16.0.0/24 -j  MASQUERADE

En renvoyant le port pptp et le protocole GRE vers notre VM:

iptables -t nat -A PREROUTING -d 192.168.3.9 -p 47 -j DNAT --to-destination 172.16.0.2
iptables -t nat -A PREROUTING -d 192.168.3.9 -p tcp --dport 1723 -j DNAT --to-destination 172.16.0.2

Si ça ne fonctionne pas, penser à charger le module "Netfilter NAT helper module for PPTP":

modprobe nf_nat_pptp

Conclusion

Cette astuce peut-être appliquée dans d'autres cas, par exemple pour simplement profiter de réseaux virtuels supplémentaires avec vmware server (ou encore kvm), ces réseaux contenant l'hôte et les invités.

Page précèdente