服务器应用程序在localhost上使用postgres。它在Xeon E3-1270 V2 @ 3.50Ghz上工作良好,具有16 GB RAM,处理超过1k db请求/秒。该应用程序创建~100个ThreadPool线程。
在E5上启动相同的应用程序(相同的配置)使用500个以上的线程,直到达到max_connections。有时交易执行速度非常慢(开始时平均需要0.18秒,最多需要15.94秒;平均提交需要0.47秒,最多需要15.93秒)。慢查询可以非常简单,例如更新一行中的两个整数列。 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;
答案 0 :(得分:1)
根据您提供的数据,问题的关键似乎是线程数增加5倍 - E3为100,而E5为500。您已经说过它们在硬件方面是相同的配置,我认为这意味着每个都有4个超线程内核,因为根据 Intel ,您列出的E3型号是什么规格表。
这意味着在可用的CPU线程数相同的情况下,您尝试处理5x的线程数。这也将大大增加内存需求,并且还会增加CPU开销,因为它可能会在尝试在所有线程之间进行上下文切换时挣扎。鉴于E5还有16 GB的RAM(基于你的same-config注释),它可能无法应对增加的开销。
我会看看你是否要将一堆硬盘交换到磁盘上,这会导致可怕的I / O性能,以及是否有CPU或I / O限制。我猜你是否因为使用 C#而运行 Windows ,所以我建议使用资源监控器< / em>深入研究。也就是说,使用它来监视 Postgres 进程并查看它们的磁盘使用情况,CPU使用情况等。该工具提供了各种各样的监视选项。
然而,除此之外,为什么不在E5上使用相同的工作负载(100个线程)运行E3?如果配置相同,主要区别(取决于精确的E5型号)将是CPU频率,虽然在每个CPU线程的基础上提供一些边缘优势,而不是E3的较慢时钟速度,但是不太可能允许与E3相比具有巨大的性能优势(相反,如果你的E5有24个核心,或48个线程)。显然,需要进行一些性能测试和调整以确定真正的红线,但我怀疑它接近100个线程而不是500个。
如果您在E5上最多运行100个线程,就像在E3上一样,性能是否正常(基本相同)?你说它已经帮助了#34;但是如果它仍然更糟的话还不清楚。
答案 1 :(得分:0)
当您需要许多连接或高性能时,请使用pgBouncer或pgPool等连接池。您的应用程序应连接到连接池上的可用连接。使用这样的硬件,您应该在池和数据库之间使用大约20到50个连接,这就是它。其他连接会降低数据库的速度。连接的确切数量取决于使用模式,但数百个连接从来都不是一个好主意,它不能很好地运行。
我有一台2处理器12核机器(E5,总共24个超线程),只需20个连接即可获得最高性能:2500 tps。并且它使用的是FusionIO卡,IO不是一个真正的问题。该应用程序是用pl / pgsql编写的,并且使用200GB的数据进行相当复杂的计算。
答案 2 :(得分:0)
我使用pgbench检查服务器性能。这是postgresql服务器问题或机器问题(硬盘驱动器或其他)。在这两种情况下,这都与编程无关。