PostgreSQL大量写入

我正在使用postgreSQL进行科学应用(无监督集群)。 python程序是multithreading的,所以每个线程pipe理自己的postmaster进程(每个核心一个)。 因此,它们是很多并发的。

每个线程进程通过两个SQL查询无限循环。 第一个是阅读,第二个是写作。 读操作考虑500次写操作考虑的行数。

这是dstat的输出:

----total-cpu-usage---- ------memory-usage----- -dsk/total- --paging-- --io/total- usr sys idl wai hiq siq| used buff cach free| read writ| in out | read writ 4 0 32 64 0 0|3599M 63M 57G 1893M|1524k 16M| 0 0 | 98 2046 1 0 35 64 0 0|3599M 63M 57G 1892M|1204k 17M| 0 0 | 68 2062 2 0 32 66 0 0|3599M 63M 57G 1890M|1132k 17M| 0 0 | 62 2033 2 1 32 65 0 0|3599M 63M 57G 1904M|1236k 18M| 0 0 | 80 1994 2 0 31 67 0 0|3599M 63M 57G 1903M|1312k 16M| 0 0 | 70 1900 2 0 37 60 0 0|3599M 63M 57G 1899M|1116k 15M| 0 0 | 71 1594 2 1 37 60 0 0|3599M 63M 57G 1898M| 448k 17M| 0 0 | 39 2001 2 0 25 72 0 0|3599M 63M 57G 1896M|1192k 17M| 0 0 | 78 1946 1 0 40 58 0 0|3599M 63M 57G 1895M| 432k 15M| 0 0 | 38 1937 

我敢肯定,我可以写得比这更多,因为我已经看到它在dstat上写了110-140M。 我怎样才能优化这个过程?

我是dstat和系统工程师的作者。 我注意到60%的艾奥瓦时间。 给你的输出,我会说你的磁盘很忙。 您可以在最近的dstat版本中尝试新的–disk-util插件选项。

这将显示您的磁盘的使用率,并且我预计它将接近您正在使用的磁盘的100%。 因此,考虑到您的特定I / O模式,您的磁盘足够忙处理读取或写入请求。

为什么这低于基准数字? 因为通常在对磁盘吞吐量进行基准testing时,您正在以一定的模式强调磁盘的最佳性能(例如线性读取或使用单个线程的大块数据写入),而在当前的工作负载中,特定的模式可能不太理想(随机读取或写入多个线程要求资源的小块或多块块)。

这种模式上的差异可以使吞吐量发生巨大的变化。 而在实际工作量中获得更好的吞吐量意味着您必须对工作负载进行基准testing,以更接近您的实际工作负载,以了解在这些条件下您可以达到的最高水平。 或者你可以通过改变你的devise来影响真正的工作负载(例如,将应用程序中的块大小与文件系统/磁盘子系统alignment),或者改进caching和/或预读。

没有简单的方法来解决这个问题,而无需分析你的工作负载。

我会说这非常依赖于程序的代码,它可能会等待工作线程重新同步,然后再开始下一个操作。

读取操作是否涉及与正在写入的数据相同的数据?如果是这样,如果您停止等待其他线程赶上,您可能会收到并发/竞争条件。

可能最好把它移到堆栈溢出。

其实它可能是Python代码级别。 Python使用全局解释器锁来处理线程,你可能会碰到锁。 在StackOverflow上有一篇关于GIL和多核系统的文章。

如果需要pipe理这些进程,我会考虑使用每个postmaster和一个“master master”的进程,或者可能需要Twisted来绕过GIL。