在单台计算机上运行Redis和PostgreSQL时优化磁盘I / O.

时间:2017-10-22 04:36:59

标签: redis

背景

我有一个使用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提交每天的样子:

enter image description here

问题:

在Redis方面我能做些什么来帮助消除这种情况?我希望Redis和PostgreSQL能够在一台机器上尽可能地和谐地生活在一起。

更多信息:

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

机器规格:

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

我的Redis配置文件的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

1 个答案:

答案 0 :(得分:0)

我可以建议一个解决方案 - dockerdocker能够限制特定容器将使用的os资源。在您的情况下,os资源似乎是磁盘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拥有更多的磁盘i / o速率。

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

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