背景
我有一个使用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配置文件的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
答案 0 :(得分:0)
我可以建议一个解决方案 - docker
。 docker
能够限制特定容器将使用的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
速度