服務器應用程序在本地主機上使用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;
我不會創建500個線程,但ThreadPool會這樣做,因爲db請求會變慢。當ThreadPool已經限制爲100個線程時,E5的統計數據將被採用,否則postgres會退出超過600個連接的RAM。更新了問題。 – Vlad