【问题标题】:Optimizing Disk I/O when running Redis and PostgreSQL on a single machine在单机上运行 Redis 和 PostgreSQL 时优化磁盘 I/O
【发布时间】:2017-10-22 18:44:53
【问题描述】:

背景:

我有一个使用 4 个 Redis 实例的实时 Django 应用程序。

前两个容量很大:备份量分别为 ~2GB 和 ~4.4GB。另外两个很小:~85M 和~15M。

redis-server --version 产生Redis server v=4.0.2 sha=00000000:0 malloc=jemalloc-4.0.3 bits=64 build=401ce53d7b0383ca


问题:

它也是一个运行 PostgreSQL 9.6.5 的繁忙服务器。 PG数据和Redis备份都保存在二级盘xvdb

我注意到,每当我的大型 Redis 实例开始备份时,磁盘 I/O 自然会出现峰值,并且 PostgreSQL 提交语句开始在慢速日志中堆积。看:

21:49:26.171 UTC [44861] ubuntu@myapp LOG:  duration: 3063.262 ms  statement: COMMIT
21:49:26.171 UTC [44890] ubuntu@myapp LOG:  duration: 748.307 ms  statement: COMMIT
21:49:26.171 UTC [44882] ubuntu@myapp LOG:  duration: 1497.461 ms  statement: COMMIT
21:49:26.171 UTC [44893] ubuntu@myapp LOG:  duration: 655.063 ms  statement: COMMIT
21:49:26.171 UTC [44894] ubuntu@myapp LOG:  duration: 559.743 ms  statement: COMMIT
21:49:26.172 UTC [44883] ubuntu@myapp LOG:  duration: 1415.733 ms  statement: COMMIT

因此,这就是我的 PostgreSQL 提交每天的样子:


问题:

我可以在 Redis 方面做些什么来帮助解决这种棘手的情况吗?我希望 Redis 和 PostgreSQL 在一台机器上尽可能和谐地生活。


更多信息:

如果需要,请询问更多信息。

机器规格:

AWS EC2 m4.4xlarge (16 cores, 64GB RAM)
Elastic Block Store gp2 volumes (105 IOPS, burst upto 3000 IOPS)

以下配置存在于我的 Redis conf 文件的 Append Only Mode 部分:

appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble no

典型的iostat -xmt 3 值为:

10/15/2017 08:28:35 PM
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
          10.44    0.00    0.93    0.15    0.06   88.43

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     0.00    0.00    2.00     0.00     0.04    38.67     0.00    0.00    0.00    0.00   0.00   0.00
xvdb              0.00     2.67    0.00   44.67     0.00     0.41    18.99     0.13    2.81    0.00    2.81   1.07   4.80

将其与记录慢速提交的时间进行比较:

10/15/2017 10:18:11 PM

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           8.16    0.00    0.65   11.90    0.04   79.24

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
xvda              0.00     4.00    0.00    1.00     0.00     0.02    48.00     0.00    1.33    0.00    1.33   1.33   0.13
xvdb              0.00     0.00    1.67 1312.00     0.01   163.50   254.90   142.56  107.64   25.60  107.75   0.76 100.00

第一个 Redis 实例具有以下快照配置:

save 7200 1
#save 300 10
#save 60 10000

第二个 Redis 实例具有以下快照配置:

save 21600 10
#save 300 10
#save 60 10000

【问题讨论】:

    标签: redis


    【解决方案1】:

    我可以建议一种解决方案 - dockerdocker 能够限制特定容器将使用的操作系统资源。在您的情况下,操作系统资源似乎是磁盘 i/o。

    --device-read-bps 标志限制读取速率(每秒字节数) 从设备。例如,此命令创建一个容器并 将 /dev/sda 的读取速率限制为每秒 1mb:

    $ docker run -it --device-read-bps /dev/sda:1mb

    docker 还有一个标志 --device-read-iops=[],它限制了设备的读取速率(每秒 IO)。

    您在此处的图像将是redis,但将postgres 也移动到docker 不会有什么坏处。这将帮助您限制 redis 容器上的磁盘 i/o 速率,以便 postgres 拥有更多。

    此解决方案应该适合您,但实现基础架构更改可能有点痛苦。

    您可以参考this SO 帖子了解docker 限制i/o 速度

    【讨论】:

    • 在这种情况下,这是我唯一现实的选择吗?
    • 您可以等待其他答案...同时我会尝试弄清楚是否可以在操作系统级别。
    • @HassanBaig 你浏览过这个链接吗? https://unix.stackexchange.com/questions/48138/how-to-throttle-per-process-i-o-to-a-max-limit
    • 我的朋友也是一个有用的链接。感谢您的建议。
    • 如果您觉得有帮助,请点赞,接受解决方案。
    猜你喜欢
    • 2011-02-03
    • 2012-10-10
    • 2014-05-20
    • 2019-12-07
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多