Benchmarking y tunning de servidores para ceph

Una vez tenemos una infraestructura de servidores funcionando bajo ceph, nos podemos preguntar ¿Cómo compruebo que mi cluster está funcionando a máximo rendimiento? En este post vamos a ver algunas herramientas para comprobar el rendimiento y tunning que podemos realizar en nuestros servidores para sacarle mas partido a Ceph.

Comprobar la escritura de disco
La forma mas sencilla para hacer un benchmark del disco es usando el comando dd. Para ello vamos a usar el siguiente comando, añadiendo la etiqueta oflag para bypassear la cache del disco:

# dd if=/dev/zero of=here bs=1G count=1 oflag=direct

Esta es la salida de uno de mis servidores, la primera sobre /root y la otra sobre /mnt/pve/ceph_data que es donde está montado un pool de ceph

root@wezen3D:~# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 11.1835 s, 96.0 MB/s

root@wezen3D:/mnt/pve/ceph_data# dd if=/dev/zero of=here bs=1G count=1 oflag=direct
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 46.5157 s, 23.1 MB/s

Comprobar la velocidad de la red
Cuando estamos usando ceph, la red es un factor muy importante. En mi actual infraestructura estoy usando puertos ethernet a 1Gbps. En los foros de proxmox muchos de los administradores usan varios puertos ethernet en bonding o incluso puertos de fibra de 10Gbps. Espero que en unas semanas pueda tener funcionando la segunda opción, de mientras todo el tunning que puedo hacer es tocar parámetros y configuración (ahora entraremos en ello).

La herramienta por excelencia para comprobar la velocidad de la red es iperf. Para hacer las pruebas necesitaremos un mínimo de 2 servidores, uno al que le pondremos el iperf como servidor y al otro como cliente. En el ejemplo estoy haciendo el iperf sobre 2 redes distintas, el primero sobre la red vmbr0 (red de comunicación) y el segundo sobre la red vmbr1 que es la que tengo dedicada a la comunicación de los servidores para el ceph (red de datos ceph).

SERVIDOR

root@wezen3D:~# iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size:  128 KByte (default)
------------------------------------------------------------
[  4] local 10.90.234.174 port 5001 connected with 10.90.234.173 port 50362
[ ID] Interval       Transfer     Bandwidth
[  4] 0.0000-10.0239 sec  1.10 GBytes   941 Mbits/sec
[  5] local 192.168.10.8 port 5001 connected with 192.168.10.7 port 55208
[ ID] Interval       Transfer     Bandwidth
[  5] 0.0000-10.0131 sec  1.15 GBytes   984 Mbits/sec

CLIENTE

root@wezen3C:~# iperf -c 10.90.234.174
------------------------------------------------------------
Client connecting to 10.90.234.174, TCP port 5001
TCP window size: 85.0 KByte (default)
------------------------------------------------------------
[  3] local 10.90.234.173 port 50362 connected with 10.90.234.174 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3] 0.0000-10.0069 sec  1.10 GBytes   943 Mbits/sec
root@wezen3C:~# iperf -c 192.168.10.8
------------------------------------------------------------
Client connecting to 192.168.10.8, TCP port 5001
TCP window size:  325 KByte (default)
------------------------------------------------------------
[  3] local 192.168.10.7 port 55208 connected with 192.168.10.8 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3] 0.0000-10.0013 sec  1.15 GBytes   985 Mbits/sec

Entre la primera red y la segunda hay un par de diferencias:

La primera que están en dos switches distintos, el de la red de comunicación (vmbr0) es un D-Link DGS-1100-16 y el de la red de datos ceph (vmbr1) es un D-Link GO-SW-16G.

La segunda que la red vmbr1, al ser el switch compatible con jumbo frames, he puesto la MTU a 9000, además de aumentar el tamaño de los paquetes:

root@wezen3D:~# apt -y install ethtool

root@wezen3D:~# ethtool -g eth1
Ring parameters for eth1:
Pre-set maximums:
RX:		4096
RX Mini:	n/a
RX Jumbo:	n/a
TX:		4096
Current hardware settings:
RX:		256
RX Mini:	n/a
RX Jumbo:	n/a
TX:		256

root@wezen3D:~# ethtool -G eth1 rx 4096 tx 4096

root@wezen3D:~# ip link set eth1 mtu 9000

root@wezen3D:~# ip a |grep vmbr1
3: eth1:  mtu 9000 qdisc mq master vmbr1 state UP group default qlen 1000
5: vmbr1:  mtu 9000 qdisc noqueue state UP group default qlen 1000
    inet 192.168.10.8/24 brd 192.168.10.255 scope global vmbr1

en una sola línea

root@wezen3D:~# apt -y install ethtool && ethtool -G eth1 rx 4096 tx 4096 && ip link set eth1 mtu 9000

Para hacer permanente esta configuración la ejecutaremos cuando se levante la interfaz vmbr1 modificando el fichero /etc/network/interfaces:

# vi /etc/network/interfaces
auto vmbr1
iface vmbr1 inet static
        address 192.168.10.8/24
        bridge-ports eth1
        bridge-stp off
        bridge-fd 0
        post-up ethtool -G eth1 rx 4096 tx 4096 && ip link set eth1 mtu 9000

Además tenemos la opción de tunear el comportamiento de los paquetes TCP en nuestro sistema:

root@wezen3D:~# vi /etc/sysctl.conf
net.core.rmem_max = 33554432
net.core.wmem_max = 33554432
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.tcp_wmem = 4096 65536 33554432

Para verificar que se aplican los cambios y aplicarlos:

root@wezen3D:~# sysctl net.ipv4.tcp_window_scaling
root@wezen3D:~# sysctl net.ipv4.tcp_timestamps
root@wezen3D:~# sysctl net.ipv4.tcp_sack
root@wezen3D:~# sysctl -p

En uno de los servidores que apliqué esta configuración hacía que tuviese una respuesta mas lenta. Como siempre, en cada cambio que apliques, recomiendo comprobar el comportamiento y rendimiento del sistema y deshacer los cambios en caso que algo vaya mal.

Ya que estamos tocando el fichero /etc/sysctl.conf otro tunning que podríamos hacer es el de indicarle como debe comportarse la swap. Si hemos montado un cluster de servidores, lo mas seguro es que te hayas hecho con un montón de RAM para tu infraestructura, aún así, al ser sistemas que suelen reiniciarse mas bien poco se van acumulando datos y vemos que el servidor termina swapeando, cosa que hace que vaya todo un poquitín mas lento de lo que realmente nos gustaría. Para ello podemos comprobar la configuración del servidor para ver a qué % debe quedar disponible de RAM para empezar a swapear, esto se hace mirando el fichero:

# cat /proc/sys/vm/swappiness
60

Este valor por defecto es muy alto, así que para ello le pondremos que el 10%

# vi /etc/sysctl.conf
vm.swappiness = 10

A continuación pararemos la swap para pasar lo que esté en la swap a la RAM y la volveremos a activar para permitir volver a usar la swap

# swapoff -a
# swapon -a

Para estos tunnings, doy las gracias a craem por sus recomendaciones :)

Si seguimos con éste artículo de la wiki de ceph, veremos que nos muestran algunos comandos mas para comprobar la salud de nuestro cluster ceph. De momento hago un copy/paste a pelo ya que esta parte aún no la he ejecutado; cosas de estas que ejecutar en un servidor en producción no hacen mucha gracia hehe, espero en los próximos días actualizar esta parte y dar mis propias explicaciones.

Benchmarking de un cluster de almacenamiento Ceph

Ceph includes the rados bench command, designed specifically to benchmark a RADOS storage cluster. To use it, create a storage pool and then use rados bench to perform a write benchmark, as shown below.

The rados command is included with Ceph.

shell> ceph osd pool create scbench 128 128
shell> rados bench -p scbench 10 write --no-cleanup

This creates a new pool named ‘scbench’ and then performs a write benchmark for 10 seconds. Notice the –no-cleanup option, which leaves behind some data. The output gives you a good indicator of how fast your cluster can write data.
Two types of read benchmarks are available: seq for sequential reads and rand for random reads. To perform a read benchmark, use the commands below:

shell> rados bench -p scbench 10 seq
shell> rados bench -p scbench 10 rand

You can also add the -t parameter to increase the concurrency of reads and writes (defaults to 16 threads), or the -b parameter to change the size of the object being written (defaults to 4 MB). It’s also a good idea to run multiple copies of this benchmark against different pools, to see how performance changes with multiple clients.
Once you have the data, you can begin comparing the cluster read and write statistics with the disk-only benchmarks performed earlier, identify how much of a performance gap exists (if any), and start looking for reasons.
You can clean up the benchmark data left behind by the write benchmark with this command:

shell> rados -p scbench cleanup

BENCHMARK A CEPH BLOCK DEVICE
If you’re a fan of Ceph block devices, there are two tools you can use to benchmark their performance. Ceph already includes the rbd bench command, but you can also use the popular I/O benchmarking tool fio, which now comes with built in support for RADOS block devices.

The rbd command is included with Ceph. RBD support in fio is relatively new, therefore you will need to download it from its repository and then compile and install it using_ configure && make && make install_. Note that you must install the librbd-dev development package with apt-get install librbd-dev or yum install librbd-dev before compiling fio in order to activate its RBD support.

Before using either of these two tools, though, create a block device using the commands below:

shell> ceph osd pool create rbdbench 128 128
shell> rbd create image01 --size 1024 --pool rbdbench
shell> sudo rbd map image01 --pool rbdbench --name client.admin
shell> sudo /sbin/mkfs.ext4 -m0 /dev/rbd/rbdbench/image01
shell> sudo mkdir /mnt/ceph-block-device
shell> sudo mount /dev/rbd/rbdbench/image01 /mnt/ceph-block-device

The rbd bench-write command generates a series of sequential writes to the image and measure the write throughput and latency. Here’s an example:

shell> rbd bench-write image01 --pool=rbdbench

Or, you can use fio to benchmark your block device. An example rbd.fio template is included with the fio source code, which performs a 4K random write test against a RADOS block device via librbd. Note that you will need to update the template with the correct names for your pool and device, as shown below.

[global]
ioengine=rbd
clientname=admin
pool=rbdbench
rbdname=image01
rw=randwrite
bs=4k
[rbd_iodepth32]
iodepth=32

Then, run fio as follows:

shell> fio examples/rbd.fio

BENCHMARK A CEPH OBJECT GATEWAY
When it comes to benchmarking the Ceph object gateway, look no further than swift-bench, the benchmarking tool included with OpenStack Swift. The swift-bench tool tests the performance of your Ceph cluster by simulating client PUT and GET requests and measuring their performance.

You can install swift-bench using pip install swift && pip install swift-bench.

To use swift-bench, you need to first create a gateway user and subuser, as shown below:

shell> sudo radosgw-admin user create --uid="benchmark" --display-name="benchmark"
shell> sudo radosgw-admin subuser create --uid=benchmark --subuser=benchmark:swift
--access=full
shell> sudo radosgw-admin key create --subuser=benchmark:swift --key-type=swift
--secret=guessme
shell> radosgw-admin user modify --uid=benchmark --max-buckets=0

Next, create a configuration file for swift-bench on a client host, as below. Remember to update the authentication URL to reflect that of your Ceph object gateway and to use the correct user name and credentials.

[bench]
auth = http://gateway-node/auth/v1.0
user = benchmark:swift
key = guessme
auth_version = 1.0

You can now run a benchmark as below. Use the -c parameter to adjust the number of concurrent connections (this example uses 64) and the -s parameter to adjust the size of the object being written (this example uses 4K objects). The -n and -g parameters control the number of objects to PUT and GET respectively.

shell> swift-bench -c 64 -s 4096 -n 1000 -g 100 /tmp/swift.conf

Although swift-bench measures performance in number of objects/sec, it’s easy enough to convert this into MB/sec, by multiplying by the size of each object. However, you should be wary of comparing this directly with the baseline disk performance statistics you obtained earlier, since a number of other factors also influence these statistics, such as:
– the level of replication (and latency overhead)
– full data journal writes (offset in some situations by journal data coalescing)
– fsync on the OSDs to guarantee data safety
– metadata overhead for keeping data stored in RADOS
– latency overhead (network, ceph, etc) makes readahead more important

TIP: When it comes to object gateway performance, there’s no hard and fast rule you can use to easily improve performance. In some cases, Ceph engineers have been able to obtain better-than-baseline performance using clever caching and coalescing strategies, whereas in other cases, object gateway performance has been lower than disk performance due to latency, fsync and metadata overhead.

CONCLUSION
There are a number of tools available to benchmark a Ceph cluster, at different levels: disk, network, cluster, device and gateway. You should now have some insight into how to approach the benchmarking process and begin generating performance data for your cluster. Good luck!

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.