获得更多的数据库性能 – postgresql

有一个django“web应用程序”(从地狱),我们正在一个专用的服务器上托pipe。 在做了一些基准testing之后,我发现“应用程序”在数据库操作上是非常糟糕的(重构目前不是一种select)。 它会产生不合要求的读写活动。 现在我们正在获得另一个(第二个)专用服务器,以提高性能和一些紧急冗余。 这两台机器运行24核(英特尔(R)至强?CPU E5645 @ 2.40GHz)和48GB的RAM(也有Raid 10,6x150gb 15k硬盘)。

我想知道如何改善设置。

  1. 使用KVM进行虚拟化,为nginx + uwsgi,memcached和postgresql分别创buildvmachines。 最好使多于1个postgresql – 并使用pg-pool来获得更多。
  2. 保持虚拟化独立,在每个服务器上安装所有内容,然后使用此镜像设置在数据中心级别获得适当的负载平衡器。
  3. 获得更多的机器 – 更less的核心,更less的内存(一般比其他两个“主要”便宜),并设置一些数据库集群呢?
  4. 如果数据库集群路由 – 那么什么会给写入和读取的最佳性能?

(在此期间我们正在重写应用程序的正确方法,但是获得当前的蹩脚的 – 运行速度更快是至关重要的,我们需要它至less在未来3个月内持续增长的stream量…)

你能提供一些关于加强安装的build议吗? 着重于为可笑的低效应用程序准备数据库机器结构。

一些基本的操作系统级数据库性能提示:

  1. 有更多的RAM比你知道如何处理。
    如果您可以将整个查询放在RAM中,或者至less将数据保存在数据库或操作系统caching中,那么您的性能将大大提高。

  2. 把钱花在快速磁盘和一个好的RAID控制器上。
    RAID 10(如果可以的话)以及RAID控制器上的电池备份,以便充分利用写入caching。

  3. 调整Postgres服务器的设置
    (有关链接到Postgres维基页面调整Khaled的答案)

  4. 利用只读从站
    如果你正在运行Postgres 9.x,你可以有只读从服务器。 将一些读取密集型工作(如报告)卸载到从站,以便在尝试进行更新时,主数据库不会忙于此。

  5. 永远不要永远不要虚拟化生产数据库服务器
    几乎从来没有 – 虚拟化数据库服务器是一个性能杀手。

对于DB特定的提示,您可能需要在dba.SE中进行检查 – 通过正确的索引和查询devise可以实现巨大的性能提升。

我总是被告知 – 尽pipe我没有经验 – 为了获得最佳的数据库速度,您应该在RAID10arrays上运行数据库守护进程(不在虚拟机中)。 据我所知,在这种情况下,RAID1 + LVM算作RAID10,并加载RAM。 虚拟机将吃进你的可用内存。

另外,我不确定在同一个物理服务器上的虚拟机前会有什么好的负载平衡(可能我完全错了)。

有几件事情可以做,以提高数据库服务器的性能。 这里有一些:

  1. 尽可能优化您的查询。
    将Postgresconfiguration文件中的log_min_duration_statement设置为您认为可接受的速度的边界,然后用EXPLAIN攻击缓慢的查询,找出缓慢的原因。

  2. 调整你的postgresql服务器参数。 您可以在网上find关于如何做到这一点的资源。

  3. 适用时将服务分离到不同的机器上。
    这不仅对性能有好处,而且对安全性也有好处。

  4. 在数据库表上创build所需的索引以加快查询速度。
    上面(1)的EXPLAIN的结果可能会帮助你