2016-11-20 280 views
7

我們在postgres日誌和高I/O等待時間中觀察到很長的COMMIT時間。 Postgres的版本的PostgreSQL 9.1.14在x86_64未知-Linux的GNU,與gcc(Ubuntu的/ Linaro的4.6.3-1ubuntu5)4.6.3,編譯64位長的COMMIT持續時間,postgres中的高I/O等待9.1

iotop顯示以下輸出

  TID PRIO USER  DISK READ DISK WRITE SWAPIN  IO COMMAND 
04:01:25 15676 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 99.99 % postgres: masked masked 10.2.21.22(37713) idle 
04:01:16 15676 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 99.99 % postgres: masked masked 10.2.21.22(37713) idle 
04:01:15 15675 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 99.99 % postgres: masked masked 10.2.21.22(37712) idle in transaction 
04:00:51 15407 be/4 postgres 173.52 K/s 0.00 B/s 0.00 % 99.99 % postgres: masked masked 10.2.21.22(37670) idle 
04:02:12 16054 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 96.63 % postgres: masked masked 10.2.21.22(37740) idle 
04:04:11 16578 be/4 postgres 0.00 B/s 23.66 K/s 0.00 % 95.39 % postgres: masked masked 10.2.21.22(37793) idle 
04:00:59 15570 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 85.27 % postgres: masked masked 10.2.21.22(37681) COMMIT 
04:02:11 16051 be/4 postgres 0.00 B/s 0.00 B/s 0.00 % 80.07 % postgres: masked masked 10.2.21.22(37737) idle 
04:01:23 15660 be/4 postgres 0.00 B/s 15.75 K/s 0.00 % 52.99 % postgres: masked masked 10.2.21.22(37693) idle 
04:01:35 15658 be/4 postgres 0.00 B/s 39.42 K/s 0.00 % 39.18 % postgres: masked masked 10.2.21.22(37691) idle in transaction 
04:01:59 15734 be/4 postgres 1288.75 K/s 0.00 B/s 0.00 % 30.35 % postgres: masked masked 10.2.21.22(37725) idle 
04:01:02 15656 be/4 postgres 7.89 K/s 0.00 B/s 0.00 % 30.06 % postgres: masked masked 10.2.21.22(37689) idle 
04:02:28 16064 be/4 postgres 1438.18 K/s 15.72 K/s 0.00 % 23.72 % postgres: masked masked 10.2.21.22(37752) SELECT 
04:03:30 16338 be/4 postgres 433.52 K/s 15.76 K/s 0.00 % 22.59 % postgres: masked masked 10.2.21.22(37775) idle in transaction 
04:01:43 15726 be/4 postgres 0.00 B/s 7.88 K/s 0.00 % 20.77 % postgres: masked masked 10.2.21.22(37717) idle 
04:01:23 15570 be/4 postgres 0.00 B/s 15.75 K/s 0.00 % 19.81 % postgres: masked masked 10.2.21.22(37681) idle 
04:02:51 16284 be/4 postgres 441.56 K/s 7.88 K/s 0.00 % 17.11 % postgres: masked masked 10.2.21.22(37761) idle 
04:03:39 16343 be/4 postgres 497.22 K/s 63.14 K/s 0.00 % 13.77 % postgres: masked masked 10.2.21.22(37780) idle 
04:02:40 16053 be/4 postgres 204.88 K/s 31.52 K/s 0.00 % 11.31 % postgres: masked masked 10.2.21.22(37739) BIND 
04:01:13 15646 be/4 postgres 0.00 B/s 47.24 K/s 0.00 % 11.17 % postgres: masked masked 10.2.21.22(37682) BIND 
04:01:13 15660 be/4 postgres 94.49 K/s 0.00 B/s 0.00 % 10.80 % postgres: masked masked 10.2.21.22(37693) COMMIT 

在高峯時段,提交時間長達60秒。 這個問題發生在一個星期前,它似乎發生在每個小時的第一分鐘。 應用程序沒有變化。 當時沒有可能導致此問題的批處理作業正在運行。 我們通過停止所有作業/抓取過程來消除這種情況。

我們已經使用pg_repack從99%的表格中刪除膨脹。 緩慢的COMMIT操作在一個沒有膨脹的表上。

使用RAID10配置。 存儲是磁性EBS。 同步提交已打開。 PostgreSQL正在使用fdatasync()。 AWS支持存儲健康的聲明。

strace顯示一堆semop調用花費很多時間,只有一個緩慢的fdatasync調用。

$ egrep "<[0-9][0-9]\." t.* 
t.31944:1479632446.159939 semop(6029370, {{11, -1, 0}}, 1) = 0 <15.760687> 
t.32000:1479632447.872642 semop(6127677, {{0, -1, 0}}, 1) = 0 <14.095245> 
t.32001:1479632444.780242 semop(6094908, {{15, -1, 0}}, 1) = 0 <17.113239> 
t.32151:1479632493.655164 select(8, [3 6 7], NULL, NULL, {60, 0}) = 1 (in [3], left {46, 614240}) <14.339090> 
t.32198:1479632451.200194 semop(5963832, {{7, -1, 0}}, 1) = 0 <11.095583> 
t.32200:1479632445.740529 semop(6094908, {{13, -1, 0}}, 1) = 0 <16.153911> 
t.32207:1479632451.329028 semop(6062139, {{7, -1, 0}}, 1) = 0 <10.970497> 
t.32226:1479632446.384585 semop(6029370, {{8, -1, 0}}, 1) = 0 <15.565608> 
t.32289:1479632451.044155 fdatasync(106)  = 0 <10.849081> 
t.32289:1479632470.284825 semop(5996601, {{14, -1, 0}}, 1) = 0 <10.686889> 
t.32290:1479632444.608746 semop(5963832, {{8, -1, 0}}, 1) = 0 <17.284606> 
t.32301:1479632445.757671 semop(6127677, {{8, -1, 0}}, 1) = 0 <16.137046> 
t.32302:1479632445.504563 semop(6094908, {{4, -1, 0}}, 1) = 0 <16.389120> 
t.32303:1479632445.889161 semop(6029370, {{6, -1, 0}}, 1) = 0 <16.005659> 
t.32304:1479632446.377368 semop(6062139, {{12, -1, 0}}, 1) = 0 <15.554953> 
t.32305:1479632448.269680 semop(6062139, {{14, -1, 0}}, 1) = 0 <13.717228> 
t.32306:1479632450.465661 semop(5963832, {{3, -1, 0}}, 1) = 0 <11.783744> 
t.32307:1479632448.959793 semop(6062139, {{8, -1, 0}}, 1) = 0 <13.289375> 
t.32308:1479632446.948341 semop(6062139, {{10, -1, 0}}, 1) = 0 <15.001958> 
t.32315:1479632451.534348 semop(6127677, {{12, -1, 0}}, 1) = 0 <10.765300> 
t.32316:1479632450.209942 semop(6094908, {{3, -1, 0}}, 1) = 0 <12.039340> 
t.32317:1479632451.032158 semop(6094908, {{7, -1, 0}}, 1) = 0 <11.217471> 
t.32318:1479632451.088017 semop(5996601, {{12, -1, 0}}, 1) = 0 <11.161855> 
t.32320:1479632452.161327 semop(5963832, {{14, -1, 0}}, 1) = 0 <10.138437> 
t.32321:1479632451.070412 semop(5963832, {{13, -1, 0}}, 1) = 0 <11.179321> 

pg_test_fsync輸出可用。

任何其他指針非常感謝。 謝謝!

+1

IOPS

  • 你能想到的任何東西,改變了約一週前?版本升級,操作系統安全補丁安裝等?或者甚至是其他看似無關的應用程序更改。儘管您不運行任何批處理作業,但您的數據庫服務器和應用程序服務器中的crontab是完全空的嗎? –

  • +0

    您能否爲我看看更多的東西 - 首先,如果數據庫位於RDS-AWS中,您是否可以查看其監控,並查看是否有任何與慢提交相關的事情。 RDS爲您提供了一個爲期兩週的窗口,讓您回顧以前的時光。如果它不是AWS,那麼您的本地監測會說什麼?其次,在每個小時的第一分鐘,似乎發生了什麼?其他人是否有可能每小時打你的DB?如果它不是一個關鍵任務,有沒有辦法讓我們用一些虛擬數據來測試你的假設?第三 - 如果你的日誌來自舊... –

    +1

    第三 - 如果你的日誌來自過去的日子還沒有旋轉,我們可以比較它們與新的日誌,看看是否有任何東西彈出。第四,你是否有機會獲得快照,預優化,以便將其放到測試服務器上,以查看奇怪行爲是否與重新包裝有關?非常感謝。 –

    回答

    4

    通過進行以下更改解決了該問題。

    1. 移到主DB到EBS optimized instance
    2. 通過SSD
    3. 後盾使用調配用於pg_repack去除醃
    +0

    你發現了什麼導致了很長的交付時間嗎? –

    +0

    這很難查明,但我們最好的猜測是@DeepakDeore建議的「吵鬧鄰居」理論https://www.mongodb.com/blog/post/selecting-aws-storage-for-mongodb-deployments-ephemeral- vs-ebs –

    +0

    您是否檢查過AWS監控?它肯定會顯示性能下降。 CloudWatch監控有一些非常整潔的統計信息...... :) –

    相關問題