Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 交易及;外部调用函数时写入性能_Postgresql_Psycopg2 - Fatal编程技术网

Postgresql 交易及;外部调用函数时写入性能

Postgresql 交易及;外部调用函数时写入性能,postgresql,psycopg2,Postgresql,Psycopg2,我有一个从python脚本(使用psycopg2)调用的存储函数,该脚本平均执行大约10条UPDATE或INSERT语句。iostat显示我经常达到15k次写入/秒,并且100%使用util 我希望我可以改变一些事情,以减少这些iostat数字,因为我需要该函数尽快运行 在这种情况下,关于事务和功能的最佳策略是什么?我应该在什么时候执行提交 我记得在某个地方读到这样调用我存储的函数会自动开始和结束一个事务。是否最好做一些其他的事情,比如将所有函数参数插入一个充当队列的表中,然后我修改我的函数以读

我有一个从python脚本(使用psycopg2)调用的存储函数,该脚本平均执行大约10条UPDATE或INSERT语句。iostat显示我经常达到15k次写入/秒,并且100%使用util

我希望我可以改变一些事情,以减少这些iostat数字,因为我需要该函数尽快运行

在这种情况下,关于事务和功能的最佳策略是什么?我应该在什么时候执行提交

我记得在某个地方读到这样调用我存储的函数会自动开始和结束一个事务。是否最好做一些其他的事情,比如将所有函数参数插入一个充当队列的表中,然后我修改我的函数以读取该表并执行其工作

注释中链接的输出

version                      | PostgreSQL 9.1.3 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-51), 64-bit
checkpoint_completion_target | 0.9
checkpoint_segments          | 32
client_encoding              | UTF8
default_statistics_target    | 100
effective_cache_size         | 8GB
lc_collate                   | en_US.UTF-8
lc_ctype                     | en_US.UTF-8
log_destination              | stderr
log_rotation_age             | 1d
log_rotation_size            | 0
log_truncate_on_rotation     | on
logging_collector            | on
maintenance_work_mem         | 64MB
max_connections              | 30
max_stack_depth              | 2MB
port                         | 5432
server_encoding              | UTF8
shared_buffers               | 4GB
synchronous_commit           | off
temp_buffers                 | 128MB
TimeZone                     | US/Eastern
wal_buffers                  | 16MB
work_mem                     | 128MB

除了kgrittin关于改进磁盘子系统的建议之外,我还想谈一谈事务。事务强制WAL上的fsync,因此提交越少,强制的物理写入就越少。一般来说,事务的逻辑分组比性能更重要,但这确实意味着,如果较长的事务彼此不等待,那么它们的性能将优于大量较短的事务。

一个函数执行中的所有内容都自动成为单个事务的一部分。如果不了解更多关于表结构、PostgreSQL调优、操作系统、文件系统和文件放置的信息,我就不能给出很多建议。(作为我不知道的一个例子:您是否已将pg_xlog目录移动到一个单独的文件系统?一个单独的RAID?在一个单独的控制器上?)。我知道这应该改变,我也有计划这样做。然而,目前我想确保我正确使用事务,并且没有做任何明显错误的事情。在不知道更多的情况下,我不得不说,在两个主轴上每秒15000次写入非常好。您可能需要添加更多的轴来做得更好。如果您还没有在配置更改方面做很多工作,那么您可能会通过配置更改挤出更多的资源。如果您将运行查询的结果发布在此页面上,我可能会发布一些值得作为正确答案的内容:我已经更新了我的帖子。仅供参考,该系统有16gb内存。您显然已经完成了您的家庭作业;难怪只有两个主轴才能获得如此好的性能。如果您需要提高写入性能,那么改进磁盘子系统可能是主要考虑的方面。在处理高负载的机器上,我们有一个用于操作系统的镜像,一个用于xlog的镜像,以及许多用于数据目录的轴。在单独的控制器上,所有控制器都配置了BBU缓存以进行写回。如果您能够容忍在硬操作系统崩溃中丢失几秒钟的事务,那么您可以查看异步提交,但在其他方面,您看起来不错。