Ceph: 激活 RBD readahead

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。我最终决定尝试一下。
以下是结果

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