2017-10-22 72 views
1

背景:優化磁盤I/O

我有一個活Django應用程序,它利用4個Redis的實例。

前兩者規模較大:備份數量分別爲〜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] [email protected] LOG: duration: 3063.262 ms statement: COMMIT 
21:49:26.171 UTC [44890] [email protected] LOG: duration: 748.307 ms statement: COMMIT 
21:49:26.171 UTC [44882] [email protected] LOG: duration: 1497.461 ms statement: COMMIT 
21:49:26.171 UTC [44893] [email protected] LOG: duration: 655.063 ms statement: COMMIT 
21:49:26.171 UTC [44894] [email protected] LOG: duration: 559.743 ms statement: COMMIT 
21:49:26.172 UTC [44883] [email protected] 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的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 

回答

0

我可以建議一個解決方案 - dockerdocker能夠限制特定容器將使用的操作系統資源。在你的情況下,os資源似乎是磁盤I/O。

--device-read-bps標誌限制設備的讀取速率(字節每秒) 。例如,該命令創建了一個容器和 每秒限制了讀出速度爲1MB從/ dev/SDA:

$泊塢運行 - 它--device讀-BPS的/ dev/SDA:1MB

碼頭也有一個標誌--device-read-iops=[]限制設備的讀取速率(IO每秒)。

在這裏您的圖片將是redis,但它也不會傷害移動postgresdocker。這將幫助您限制redis容器上的磁盤I/O速率,以便postgres擁有更多的容量。

該解決方案應該適用於您,但基礎結構更改可能會有點讓人難以實現。

你可以參考this SO張貼docker限制i/o速度

+0

這是我唯一現實的選擇給出的情景? –

+0

你可以等待其他答案......同時我會試着弄清楚在OS級別是否有可能。 –

+0

@HassanBaig你是否通過這個鏈接? 'https:// unix.stackexchange.com/questions/48138 /每個進程如何限制流量-i-o-to-a-max-limit' –