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 更新: 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,SEEK_END) = 8192 ftruncate(9,0) = 0 lseek(9,SEEK_END) = 0 open("base/16388/t24_1435941",O_RDWR) = 18 lseek(18,SEEK_END) = 0 write(9," 1 000 36037360374 b15 2 "...,8192) = 8192 lseek(18,SEEK_END) = 0 close(9) = 0 open("base/16388/t24_1435947",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",SEEK_END) = 0 close(9) = 0 更新: 更新: CREATE TEMPORARY TABLE... ON COMMIT DELETE ROWS; 临时表的语义非常适合我们的复制方案,并简化了我们用于MySQL的许多代码,但看起来实现也不公平.从我所做的一些研究中,我不认为临时表真正意味着我们使用它们的功能. 我不是这个主题的内部专家(甚至不是很接近),只是它的用户,所以我的解释可能不是100%准确,但我认为它非常接近. 解决方法
你的PostgreSQL配置已经过时了.你的初帖很可疑
Cpu(s): 18.9%us,0.0%st Mem: 32865916k total,575608k buffers Swap: 16777208k total,4464212k cached 在您的服务器上超过32GB,~25GB是免费的,不包括~575MB的缓冲区. 从postgresql.conf文件中 shared_buffers = 32MB # min 128kB #temp_buffers = 8MB # min 800kB #max_prepared_transactions = 0 # zero disables the feature ... #work_mem = 1MB # min 64kB #maintenance_work_mem = 16MB # min 1MB #max_stack_depth = 2MB 我假设这是一个专用数据库.如果是这样,请将其更改为以下参数并重新加载/重新启动, shared_buffers = 16GB # min 128kB temp_buffers = 128MB # min 800kB #max_prepared_transactions = 0 # zero disables the feature ... work_mem = 8MB # min 64kB maintenance_work_mem = 64MB # min 1MB max_stack_depth = 4MB 请告诉我这会如何改变您的表现,并可以根据需要进一步调整. 关于未记录的表,如果临时表包含临时的临时数据,并且正如您所提到的那样,是在会话中创建的,最好使用未记录的表. 如果可以接受,您可以在会话后截断表. 更多信息在这里 – http://michael.otacoo.com/postgresql-2/unlogged-table-performance-in-postgresql-9-1/ 我不确定为什么需要临时表进行复制.你不能使用PostgreSQL流复制吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |