我有两个相同的服务器,两者都安装了postgresql服务器版本9.0.4,配置相同。如果我启动一个执行大约5k插入的.sql文件,在第一个上需要几秒钟,在第二个上需要1分30秒。
如果我设置了synchronous_commit,速度会急剧降低(如预期的那样),并且两台服务器的性能相当。但是如果我将synchronous_commit设置为on,则在一台服务器上插入脚本的执行时间增加不到一秒,而另一台则增加太多,正如我在第一段时间所说的那样。
有关这种表演差异的想法吗?我错过了一些配置吗?
更新:尝试了一个简单的磁盘测试:time sh -c "dd if=/dev/zero of=ddfile bs=8k count=200000 && sync"
快速服务器输出:
1638400000 bytes (1.6 GB) copied, 1.73537 seconds, 944 MB/s
real 0m32.009s
user 0m0.018s
sys 0m2.298s
服务器输出缓慢:
1638400000 bytes (1.6 GB) copied, 4.85727 s, 337 MB/s
real 0m35.045s
user 0m0.019s
sys 0m2.221s
常用功能(两台服务器):
SATA, RAID1, controller: Intel Corporation 82801JI (ICH10 Family) SATA AHCI Controller, distribution: linux centOS. mount -v output:
/dev/md2 on / type ext3 (rw)
proc on /proc type proc (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/md1 on /boot type ext3 (rw)
快速服务器:内核2.6.18-238.9.1.el5#1 SMP
Disk /dev/sda: 750.1 GB, 750156374016 bytes
255 heads, 63 sectors/track, 91201 cylinders, total 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 3906 4209029 2102562 fd Linux raid autodetect
/dev/sda2 4209030 4739174 265072+ fd Linux raid autodetect
/dev/sda3 4739175 1465144064 730202445 fd Linux raid autodetect
慢速服务器:内核2.6.32-71.29.1.el6.x86_64#1 SMP
Disk /dev/sda: 750.2 GB, 750156374016 bytes
64 heads, 32 sectors/track, 715404 cylinders, total 1465149168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0006ffc4
Device Boot Start End Blocks Id System
/dev/sda1 2048 4194303 2096128 fd Linux raid autodetect
/dev/sda2 4194304 5242879 524288 fd Linux raid autodetect
/dev/sda3 5242880 1465147391 729952256 fd Linux raid autodetect
解决性能问题是否有用?
答案 0 :(得分:1)
对我而言,这听起来像在“快速”服务器中有硬盘的写缓存,而在慢速服务器中,硬盘在PG写入时真正写入数据(通过调用fsync) )
答案 1 :(得分:1)
我认为你的新内核速度慢的服务器存在工作障碍。这很好,否则您可以在发生电源故障时丢失数据。但它当然比启用写入缓存且没有障碍的运行速度慢,也就是用剪刀运行。
您可以使用mount -v
检查是否启用了障碍 - 在输出中搜索barrier=1
。您可以禁用文件系统(mount -o remount,barrier=0 /
)的障碍以加快速度,但随后又存在数据损坏的风险。
尝试在一个事务中执行5k插入 - Postgres不必在插入的每一行上写入磁盘。每秒交易次数的理论限制与磁盘旋转速度(7200rpm磁盘≈7200/ 60 tps = 120 tps)相当,因为磁盘每次旋转只能写入扇区一次。