Ceph: 激活 RBD readahead

shan

Ceph: activate RBD readhead

RBD readahead 是在 Giant 中引入的。

在虚拟机的启动序列中,如果 librbd 检测到连续读取,它将尝试在 OSD 上进行 readahead,并将 RBD 缓存填充为内容。当操作系统读取时,它将从 librbd 缓存中获取这些读取。控制 readahead 的参数

rbd readahead trigger requests = 10 # number of sequential requests necessary to trigger readahead.
rbd readahead max bytes = 524288 # maximum size of a readahead request, in bytes.
rbd readahead disable after bytes = 52428800

测试过程

我测试这种方法非常简单,我只是计算了 SSH 到虚拟机器所需的时间。为了获得平均值,我进行了 10 次测试,有和没有 readahead 的情况。

执行脚本

bash for i in $(seq 1 10) do nova delete leseb > /dev/null 2>&1 sleep 5 nova boot --flavor m1.small --image 19dab28e-5d13-4d13-9fd4-dbc597fdccb7 leseb > /dev/null 2>&1 time ./checkup.sh 10.0.0.2 22 done

Checkup 脚本

```bash

#!/bin/bash

host=$1 port=$2 max=1000000 counter=1

while true do python -c "import socket;s = socket.socket(socket.AF_INET, socket.SOCK_STREAM);s.connect(('$host', $port))" > /dev/null 2>&1 && break || \ echo -n "."

if [[ ${counter} == ${max} ]];then

  echo "Could not connect"
  exit 1

fi (( counter++ )) done

启动时间比较

在某个时候,我尝试查看虚拟机的日志并分析块大小。我希望使用更准确的 rbd_readahead_max_bytes 值能给我带来一些好处。因此,我查询了 admin socket,希望能获得有关启动序列中发生的读取的一些有用信息

```bash $ sudo ceph --admin-daemon /var/run/ceph/guests/ceph-client.cinder.463407.139639582721120.asok perf dump ... ...

    "flush": 0,
    "aio_rd": 5477,
    "aio_rd_bytes": 117972992,
    "aio_rd_latency": {
        "avgcount": 5477,
        "sum": 16.090880101

... ```

不幸的是,我似乎无法获得任何有趣的信息,理想情况下,我应该得到平均读取量。我的最后手段是记录 librbd 的每个读取条目。我使用了 我之前的文章 作为参考。在启动序列期间的 9903 次读取中,结果平均读取块大小为 98304。我最终决定尝试一下。

以下是结果

Ceph RBD readahead boot time comparison

我的第二次优化尝试显然是最成功的,因为我们几乎可以在 23 秒以下启动虚拟机。与此同时,默认值还不错,听起来也相当合理。因此,坚持使用默认值不应该有问题。