Xeon E5上的服务器应用程序性能比Xeon E3差2倍

时间:2015-02-04 19:22:00

标签: c# performance postgresql nhibernate npgsql

服务器应用程序在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;

和~2000授予锁定 enter image description here 是什么导致的?

3 个答案:

答案 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服务器问题或机器问题(硬盘驱动器或其他)。在这两种情况下,这都与编程无关。