atualmente tento configurar um cluster Gluster e o desempenho está estranho e não tenho certeza se configurei algo errado. Estou usando 4 servidores raiz Hetzner executando Debian Buster com Intel i7, 128 GB de RAM, dois NVMe e um HDD. Cada sistema possui uma interface de rede separada de 10 Gbs para comunicação interna (todos os hosts estão conectados diretamente a um switch em um rack).
Quando testo a rede com iperf - tenho cerca de 9,41 Gbits/seg entre todos os pares.
Eu instalei os pacotes glusterfs-server padrão do Debian (glusterfs-server_5.5-3_amd64.deb).
Eu construí três volumes com:
- SSD (gv0) em /mnt/ssd/gfs/gv0
- HDD (gv1) em /mnt/hdd/gfs/gv1
- Disco RAM (gv2) em /mnt/ram/gfs/gv2
Com
gluster volume create gv0 replica 2 transport tcp 10.255.255.1:/mnt/ssd/gfs/gv0 10.255.255.2:/mnt/ssd/gfs/gv0 10.255.255.3:/mnt/ssd/gfs/gv0 10.255.255.4:/mnt/ssd/gfs/gv0 force
...
E algumas mudanças de configuração - todos os volumes ficam assim (gv0, gv1 e gv2 são iguais)
# gluster volume info gv0
Volume Name: gv0
Type: Distributed-Replicate
Volume ID: 0fd68188-2b74-4050-831d-a590ef0faafd
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: 10.255.255.1:/mnt/ssd/gfs/gv0
Brick2: 10.255.255.2:/mnt/ssd/gfs/gv0
Brick3: 10.255.255.3:/mnt/ssd/gfs/gv0
Brick4: 10.255.255.4:/mnt/ssd/gfs/gv0
Options Reconfigured:
performance.flush-behind: on
performance.cache-max-file-size: 512MB
performance.client-io-threads: off
nfs.disable: on
transport.address-family: inet
Mais tarde encontrei algumas otimizações na rede. Mas o desempenho não muda muito (é claro que é um teste de desempenho de thread único).
# gluster volume info gv0
Volume Name: gv0
Type: Distributed-Replicate
Volume ID: 0fd68188-2b74-4050-831d-a590ef0faafd
Status: Started
Snapshot Count: 0
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: 10.255.255.1:/mnt/ssd/gfs/gv0
Brick2: 10.255.255.2:/mnt/ssd/gfs/gv0
Brick3: 10.255.255.3:/mnt/ssd/gfs/gv0
Brick4: 10.255.255.4:/mnt/ssd/gfs/gv0
Options Reconfigured:
performance.write-behind-window-size: 1MB
cluster.readdir-optimize: on
server.event-threads: 4
client.event-threads: 4
cluster.lookup-optimize: on
performance.readdir-ahead: on
performance.io-thread-count: 16
performance.io-cache: on
performance.flush-behind: on
performance.cache-max-file-size: 512MB
performance.client-io-threads: on
nfs.disable: on
transport.address-family: inet
Também tentei com molduras jumbo e sem molduras. Mas também não fez diferença
# ip a s
...
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc mq state UP group default qlen 1000
link/ether 6c:b3:11:07:f1:18 brd ff:ff:ff:ff:ff:ff
inet 10.255.255.2/24 brd 10.255.255.255 scope global enp3s0
valid_lft forever preferred_lft forever
Todos os três volumes são montados diretamente em um dos pares
10.255.255.1:gv0 /mnt/gv0 glusterfs defaults 0 0
10.255.255.1:gv1 /mnt/gv1 glusterfs defaults 0 0
10.255.255.1:gv2 /mnt/gv3 glusterfs defaults 0 0
Então criei alguns dados de teste em um disco RAM separado. Eu escrevi um script que gera dd if=/dev/urandom
um loop for com muitos arquivos. Eu gerei os arquivos primeiro, porque /dev/urandom
parece "finalizar" em torno de 45Mb/s, quando gravo em um disco RAM.
----- generate files 10240 x 100K
----- generate files 5120 x 1000K
----- generate files 1024 x 10000K
sum: 16000 MB on /mnt/ram1/
E agora vem a transferência. Acabei de ligar cp -r /mnt/ram1/* /mnt/gv0/
etc. para escrever e cp -r /mnt/gv0/* /mnt/ram1/
contar os segundos. E isso parece terrível.
read write
ram <-> ram 4s 4s
ram <-> ssd 4s 7s
ram <-> hdd 4s 7s
ram <-> gv0 (ssd) 162s 145s
ram <-> gv1 (hdd) 164s 165s
ram <-> gv2 (ram) 158s 133s
Portanto, o desempenho de leitura e gravação com disco local comparado e cluster gluster é cerca de 40 vezes mais rápido. Isso não pode ser.
O que eu sinto falta?