linux 朝一个磁盘写入,linux – Postmaster使用过多的CPU和磁盘写入

使用PostgreSQL 9.1.2

我看到过多的CPU使用率和来自postmaster任务的大量磁盘写入.即使我的应用程序几乎什么都没做(每MINUTE插入10次),也会发生这种情况.然而,有合理数量的连接打开.

我一直试图确定我的应用程序中是什么导致了这一点.我很喜欢postgresql,到目前为止还没到任何地方.我在配置文件中打开了一些日志记录选项,并查看了pg_stat_activity表中的连接,但它们都是空闲的.然而,每个连接消耗约50%的CPU,并且正在向磁盘写入~15M / s(什么都不读).

我基本上使用股票postgresql.conf只需很少的调整.我很感激任何建议或指示我可以做些什么来追踪这一点.

以下是top / iotop向我展示的示例:

Cpu(s): 18.9%us, 14.4%sy, 0.0%ni, 53.4%id, 11.8%wa, 0.0%hi, 1.5%si, 0.0%st

Mem: 32865916k total, 7263720k used, 25602196k free, 575608k buffers

Swap: 16777208k total, 0k used, 16777208k free, 4464212k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

17057 postgres 20 0 236m 33m 13m R 45.0 0.1 73:48.78 postmaster

17188 postgres 20 0 219m 15m 11m R 42.3 0.0 61:45.57 postmaster

17963 postgres 20 0 219m 16m 11m R 42.3 0.1 27:15.01 postmaster

17084 postgres 20 0 219m 15m 11m S 41.7 0.0 63:13.64 postmaster

17964 postgres 20 0 219m 17m 12m R 41.7 0.1 27:23.28 postmaster

18688 postgres 20 0 219m 15m 11m R 41.3 0.0 63:46.81 postmaster

17088 postgres 20 0 226m 24m 12m R 41.0 0.1 64:39.63 postmaster

24767 postgres 20 0 219m 17m 12m R 41.0 0.1 24:39.24 postmaster

18660 postgres 20 0 219m 14m 9.9m S 40.7 0.0 60:51.52 postmaster

18664 postgres 20 0 218m 15m 11m S 40.7 0.0 61:39.61 postmaster

17962 postgres 20 0 222m 19m 11m S 40.3 0.1 11:48.79 postmaster

18671 postgres 20 0 219m 14m 9m S 39.4 0.0 60:53.21 postmaster

26168 postgres 20 0 219m 15m 10m S 38.4 0.0 59:04.55 postmaster

Total DISK READ: 0.00 B/s | Total DISK WRITE: 195.97 M/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND

17962 be/4 postgres 0.00 B/s 14.83 M/s 0.00 % 0.25 % postgres: aggw aggw [local] idle

17084 be/4 postgres 0.00 B/s 15.53 M/s 0.00 % 0.24 % postgres: aggw aggw [local] idle

17963 be/4 postgres 0.00 B/s 15.00 M/s 0.00 % 0.24 % postgres: aggw aggw [local] idle

17188 be/4 postgres 0.00 B/s 14.80 M/s 0.00 % 0.24 % postgres: aggw aggw [local] idle

17964 be/4 postgres 0.00 B/s 15.50 M/s 0.00 % 0.24 % postgres: aggw aggw [local] idle

18664 be/4 postgres 0.00 B/s 15.13 M/s 0.00 % 0.23 % postgres: aggw aggw [local] idle

17088 be/4 postgres 0.00 B/s 14.71 M/s 0.00 % 0.13 % postgres: aggw aggw [local] idle

18688 be/4 postgres 0.00 B/s 14.72 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

24767 be/4 postgres 0.00 B/s 14.93 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

18671 be/4 postgres 0.00 B/s 16.14 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

17057 be/4 postgres 0.00 B/s 13.58 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

26168 be/4 postgres 0.00 B/s 15.50 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

18660 be/4 postgres 0.00 B/s 15.85 M/s 0.00 % 0.00 % postgres: aggw aggw [local] idle

更新:许多文件写入似乎是$PG_DATA / base /目录中的一些临时(?)文件.这里的文件结构的My understanding是每个表基本上存储为名称为表的OID的文件.但是,有大量名为tnn_nnnnnnn的文件,并且这些文件似乎不断被写入(可能被写入).这些文件是为了什么?有大约4700个文件,大小都是8K:

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t12_1430975

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t16_1432736

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t28_1439066

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t24_1436243

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t24_1436210

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t19_1393372

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t28_1439051

-rw-------. 1 postgres postgres 8192 Jul 3 23:08 t8_1430334

更新:

在postmaster进程上运行strace基本上显示了很多文件I / O的东西:

open("base/16388/t24_1435947_fsm", O_RDWR) = -1 ENOENT (No such file or directory)

open("base/16388/t24_1435947_vm", O_RDWR) = -1 ENOENT (No such file or directory)

open("base/16388/t24_1435947", O_RDWR) = 9

lseek(9, 0, SEEK_END) = 8192

ftruncate(9, 0) = 0

lseek(9, 0, SEEK_END) = 0

open("base/16388/t24_1435941", O_RDWR) = 18

lseek(18, 0, SEEK_END) = 0

write(9, "\0\0\0\0\0\0\0\0\1\0\0\0000\0\360\37\360\37\4 \0\0\0\0b1\5\0\2\0\0\0"..., 8192) = 8192

lseek(18, 0, SEEK_END) = 0

close(9) = 0

open("base/16388/t24_1435947", O_RDWR) = 9

lseek(9, 0, SEEK_END) = 8192

close(18) = 0

close(9) = 0

open("base/16388/t24_1435944_fsm", O_RDWR) = -1 ENOENT (No such file or directory)

open("base/16388/t24_1435944_vm", O_RDWR) = -1 ENOENT (No such file or directory)

open("base/16388/t24_1435944", O_RDWR) = 9

lseek(9, 0, SEEK_END) = 0

close(9) = 0

更新:

所以这个问题似乎与临时表有关.我们更改了设置,因此临时表是“常规”表,所有磁盘活动都消失了,性能又回到了我预期的状态.现在,这个变化只是一个快速而肮脏的测试:如果我们真的要改变使用常规表,我们就会遇到并发和清理问题.临时表是真的那么邪恶,还是我们滥用它们?

更新:

更多背景.我正在使用内部开发的statement based replication middleware.它已经相当成熟,并且已经在许多项目中使用了很多年,但使用的是MySQL.我们在过去的一两年里一直在使用PostgreSQL.我们基本上使用临时表作为复制机制的一部分.无论何时建立新连接,我们都会为数据库中的每个表创建一个临时表.使用10-20(长寿命)连接和~50个表,这可能相当于许多临时表.所有临时表都创建于:

CREATE TEMPORARY TABLE... ON COMMIT DELETE ROWS;

临时表的语义非常适合我们的复制方案,并简化了我们用于MySQL的许多代码,但看起来实现也不公平.从我所做的一些研究中,我不认为临时表真正意味着我们使用它们的功能.

我不是这个主题的内部专家(甚至不是很接近),只是它的用户,所以我的解释可能不是100%准确,但我认为它非常接近.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值