我的一台 PostgreSQL 服务器托管了几个 (1-3) 数据库,这些数据库接收恒定的数据流。数据不是特别结构化,它相当于当前时间和特定时刻的各种观察数据。数据速率相当高;一个数据库每天大约可以计算出 1 GB 的数据,而另一个数据库则大约是每天 1 GB 的数据。我不希望这个比率会增加。读取性能的优先级要低得多,目前是可以接受的。
在日志中,我有这条消息:
LOG: checkpoints are occurring too frequently (15 seconds apart)
HINT: Consider increasing the configuration parameter "checkpoint_segments".
Run Code Online (Sandbox Code Playgroud)
该值当前设置为 16,这是由 提供的pgtune
。
我应该考虑哪些设置来提高写入性能?我宁愿保持尽可能多的安全。考虑到传入的数据量,只要大部分数据完好无损,我可以接受在故障中丢失一些最近的数据。
编辑:我现在使用 PostgreSQL 9.0,但我计划升级到 9.1。我不会发布硬件细节,因为虽然我承认它们的重要性,但我最终将需要在具有非常不同硬件的几台机器上进行这种优化。如果硬件对答案至关重要,请给我一般信息,以便我可以将答案应用于具有不同硬件配置的机器。
我正在运行 PostgreSQL 9.1。我注意到非常糟糕的索引占用了我服务器上的大量空间,例如:
evlampts=# SELECT
pg_size_pretty(pg_relation_size('mcdata_2011_07')) AS relation_size,
pg_size_pretty(pg_total_relation_size('mcdata_2011_07')) AS total_relation_size,
pg_size_pretty(pg_indexes_size('mcdata_2011_07')) AS indexes_size;
relation_size | total_relation_size | indexes_size
---------------+---------------------+--------------
43 GB | 100 GB | 57 GB
(1 row)
Run Code Online (Sandbox Code Playgroud)
然后我可以看到,虽然其中很大一部分是主键,但我在一个索引中有 11 GB,在另一个索引中有 16 GB:
evlampts=# SELECT
pg_size_pretty(pg_relation_size('mcdata_2011_07_timestamp_idx')) AS timestamp_idx_size,
pg_size_pretty(pg_relation_size('mcdata_2011_07_host_idx')) AS host_idx_size;
timestamp_idx_size | host_idx_size
--------------------+---------------
11 GB | 16 GB
(1 row)
Run Code Online (Sandbox Code Playgroud)
如果我继续删除这些索引,我看不到操作系统中磁盘空间的显着改善:
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/md0 1.8T 1.8T 32G 99% /export/home/lando
$ psql evlampts
evlampts=# drop index mcdata_2011_07_host_idx;
DROP INDEX …
Run Code Online (Sandbox Code Playgroud)