天天看点

PostgreSQL 异步IO实测

postgresql , effective_io_concurrency , 异步io

异步io的目的是充分发挥块设备的吞吐能力,让块设备处于更繁忙的工作状态(一次连续摄取更多的块),而不是等用户进程需要数据时再读取。

如果数据库并发连接(或者活跃会话)足够时,并且块设备处于繁忙状态,那么没有必要开启异步io,因为开了也没什么用,块设备已经足够的忙了。

目前postgresql的bitmap heap scan支持异步io,因为bitmap heap scan是按顺序读取堆表的数据块的,对于机械硬盘,bitmap heap scan异步io效率可以得到充分的发挥。(实际上全表扫描也适合异步io。)

异步io的参数effective_io_concurrency,应该如何设置呢?

如果是磁盘阵列,根据表空间所在的块设备进行设置,例如raid0, raid10,设置为磁盘个数,而raid5或者其他raid,设置为实际的数据盘个数(如,raid5(10)设置为9)。

如果设置为0,表示不使用异步io。

仅仅当操作系统支持posix时,才能使用异步io。

那么生产中应该如何设置呢?

我们实际测试一下,如果是ssd,从测试结果看,建议关闭异步io。(虽然手册中提到如果是内存盘或ssd盘,可以设置更大的值,但是实测效果不理想。)

src/test/regress/expected/select_parallel.out

分别使用perf record -ag -p $pid 进行了跟踪。因为这个版本编译时没有打开几个需要的开关(-g -ggdb -fno-omit-frame-pointer),所以看不出什么问题。用户可以自己测试并分析一下。

<a href="https://github.com/digoal/blog/blob/master/201611/20161121_01.md">《postgresql on linux 最佳部署手册》</a>

<a href="https://github.com/digoal/blog/blob/master/201611/20161127_01.md">《linux 性能诊断 perf使用指南》</a>

<a href="https://github.com/digoal/blog/blob/master/201611/20161129_01.md">《postgresql 源码性能诊断(perf profiling)指南》</a>

<a href="https://www.postgresql.org/docs/devel/static/runtime-config-resource.html">https://www.postgresql.org/docs/devel/static/runtime-config-resource.html</a>

src/backend/executor/nodebitmapheapscan.c