2015-02-04 36 views
0

服務器應用程序在本地主機上使用postgres。它在至強E3-1270 V2 @ 3.50Ghz,16 GB RAM的情況下運行良好,可處理超過1k db的請求/秒。該應用程序創建〜100個ThreadPool線程。Xeon E5上的服務器應用程序性能比Xeon E3差2倍

在E5上啓動的相同應用(相同配置)使用500個或更多線程,直到達到max_connections。有時事務執行非常緩慢(開始時平均需要0.18s,最多15.94s;提交時平均需要0.47s,最大需要15.93s)。慢速查詢可能非常簡單,例如更新一行中的兩個整數列。在pg_stat_statements中沒有問題的查詢。我不得不限制ThreadPool最小/最大線程數爲100,否則postgres將退出使用600多個連接的RAM。

典型的代碼,在某些情況下,執行〜12秒:

 using (var s = HibernateSessionFactory.OpenSession()) 
     using (var tr = s.BeginTransaction()) 
     { 
      try 
      { 
       try 
       { 
        s.Lock(User, LockMode.None); 
       } 
       catch 
       { 
        s.Lock(User, LockMode.None); 
       } 

       User.Guild = null; 
       tr.Commit(); 
      } 
      catch 
      { 
       tr.Rollback(); 
       throw; 
      } 
     } 

當應用程序停止響應客戶端請求pgAdmin的「服務器狀態」顯示這些查詢:

set extra_float_digits=3; set ssl_recognitation_limit=0; select 'npgsql12345'; 
DISCARD ALL 
COMMIT 
BEGIN; SET TRANSACTION ISOLATION LEVEL READ COMMITED; 

和〜2000年授予的鎖 enter image description here 是什麼原因造成的?

回答

0

我用pgbench來檢查服務器的性能。這是postgresql服務器問題或機器問題(硬盤或其他)。在這兩種情況下,這都與編程無關。

1

根據您提供的數據,問題的關鍵似乎是threadcount的5倍增加 - E3上的100與E5上的500。您已經說過,它們在硬件方面是相同的配置,我認爲這意味着每個核心都有4個超線程核心,因爲根據英特爾規格表,這是您列出的E3型號。

這意味着在可用的CPU線程數相同的情況下,您嘗試處理的線程數是5x。這也將極大地提高內存需求,並且還會增加CPU開銷,因爲它可能會在嘗試在所有線程之間進行上下文切換時發生顛簸。鑑於E5也有16 GB的RAM(基於您的同一配置評論),它可能無法應付額外的開銷。

我會看看你是否換了一噸到磁盤,這會導致可怕的I/O性能,以及事情是CPU還是I/O限制。我猜你正在運行Windows基於使用C#,所以我建議使用類似資源監視器來深入瞭解。也就是說,使用它來監視進程並查看其磁盤使用情況,CPU使用情況等。該工具中提供了各種各樣的監視選項。但是,除此之外,爲什麼不直接在E5上使用相同的工作負載(100個線程)運行,這與E3一起工作的很好?如果在其他方面進行了相同的配置,主要區別(取決於確切的E5型號)將是CPU頻率,該頻率雖然在E3的較低時鐘速度下以CPU線程爲基礎提供了一些邊緣優勢,但不太可能允許在E3方面有着巨大的性能優勢(而不是說,如果你的E5有24個內核或者48個線程)。很明顯,需要進行一些性能測試和調整才能確定真正的紅線,但我懷疑它比500個線程更接近100個線程。

如果您在E5上運行最多100個線程,就像您一樣E3,表現還不錯(基本相同)?你說它「有所幫助」,但是如果情況更糟的話,不清楚。

+0

我不會創建500個線程,但ThreadPool會這樣做,因爲db請求會變慢。當ThreadPool已經限制爲100個線程時,E5的統計數據將被採用,否則postgres會退出超過600個連接的RAM。更新了問題。 – Vlad

0

當您需要多個連接或高性能時,請使用像pgBouncer或pgPool這樣的連接池。您的應用程序應連接到連接池上的可用連接。像這樣的硬件,你應該在池和數據庫之間使用20到50個連接,就是這樣。其他連接會降低數據庫的速度。確切的連接數量取決於使用模式,但數百個連接永遠不是一個好主意,但性能不佳。

我有一個2處理器12核心機器(E5,24個超線程總數),只需20個連接即可達到最高性能:2500 tps。而且它使用的是FusionIO卡,IO不是一個真正的問題。該應用程序是用pl/pgsql編寫的,並且使用200GB數據進行相當複雜的計算。

+0

當我沒有爲npgsql指定最大池大小的值時,我有'Timout從池'異常中獲取連接。 – Vlad

+0

您與連接池有多少個連接,以及您的連接池與數據庫有多少連接? –

+0

Npgsql使用自己的連接池,該連接池在服務器應用程序上下文中運行。我指定最大池大小= 1000(爲了避免超時),但現在我認爲連接池大小與最大允許線程數相關(因爲應用程序無法同時執行更多查詢)。 postgres = 120上的當前num_backends值幾乎等於當前服務器應用線程數。 – Vlad