V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sjmcefc2
V2EX  ›  程序员

求一个 postgresql 优化教程。

  •  
  •   sjmcefc2 · 2018-07-16 23:59:11 +08:00 · 3316 次点击
    这是一个创建于 2322 天前的主题,其中的信息可能已经有所发展或是发生改变。

    现在 postgresql 使用发现性能有点差,insert 比较慢。copy 也比较费时间。 不知道 e3 1240 这种 cpu,32g 内存,最终能优化成什么样子?能应对多大的查询? 如何优化?如何衡量性能? 求大神指点迷津。

    12 条回复    2018-07-23 09:15:48 +08:00
    kxjhlele
        1
    kxjhlele  
       2018-07-17 06:36:30 +08:00 via Android
    看看德哥的 GitHub
    cstj0505
        3
    cstj0505  
       2018-07-17 09:18:45 +08:00
    要想写入快把 share_mem 调大些,效果最明显。
    然后再就是调整调整 io 参数,这个参考德哥比较好。
    不过 pginsert、copy 已经够快了,我笔记本同样的数据测试,写 SSD,pg insert 单线程写能到 7w 行 /s,mysql 猜不到 2 万。
    copyin 更是能把硬盘 io 写满,看看是不是你 io 的瓶颈。
    cstj0505
        4
    cstj0505  
       2018-07-17 09:19:53 +08:00
    对了,pg10 的分区表写入速度也会比较捉急,最好是对着分区直接写
    sjmcefc2
        5
    sjmcefc2  
    OP
       2018-07-17 12:19:10 +08:00
    机器配置:E3-1241V3, 32G memory,HDD(LVM,7200rpm).
    操作系统 :RHEL 7.4 64bit


    shared_buffers = 8G

    maintenance_work_mem = 2GB
    checkpoint_timeout = 5min
    max_wal_size = 8GB
    min_wal_size = 4GB

    wal_level = minimal
    archive_mode = off
    max_wal_senders =0

    effective_cache_size = 4GB
    work_mem = 209715kB
    上面是机器情况和参数变化。
    @cstj0505 说的 share-men 在我机器上要调整到多大?
    怎么计算每秒 insert 多少行?如果 7W 行 /s,那么 100 亿行也用不了多久?这样一行的数据有多少 k 呢?我的比较复杂,日志一大串。有时候发现 insert 时候的 cpu 其实很空闲,如何才能压榨机器到极致?
    分区表确实感觉慢,如何对着分区表直接写?
    这种集中数据装入,频繁查询的应用怎么调优惠比较好?

    @cstj0505
    @NaVient 感谢提供教程。
    cstj0505
        6
    cstj0505  
       2018-07-17 17:42:57 +08:00
    @sjmcefc2
    shared_buffers 1/4 内存差不多,你可以用 fio 或者 dd 测一下你硬盘的持续 io 性能。再看看你写的时候 iostat 看看实际是多少。如果写不满,那就是数据库配置问题。不过即使默认的配置 pg 的持续写入性能还是非常高的,基本上也能接近 io 的最大能力。

    你如果是分区表,只好不要直接写主表,按照你分区规则或者去系统中查找到对应的子表,然后把对应的数据直接 insert 子表,记得批量提交。用 copyin 的话性能会更快。
    cstj0505
        7
    cstj0505  
       2018-07-17 17:56:29 +08:00
    @sjmcefc2 上次我发过一个帖子,我同事也是机械盘 3,4 亿条 400 多秒
    https://www.v2ex.com/t/408181#reply112
    sjmcefc2
        8
    sjmcefc2  
    OP
       2018-07-17 19:52:32 +08:00
    @cstj0505 非常感谢您的热心解答。
    我用 time dd if=/dev/zero of= /testw.dbf bs=4k count=100000 测试,
    发现 410mb 的时候,2.4G/s,很棒,但是超过 6.6G,也就是 count=1600000 的时候,速度下降到 1.8GB/s,
    1800000 的时候(7.4G),速度下降到 1.5GB/s,
    1900000 的时候(7.8G),速度为 1.4GB/s,
    2000000 的时候(8.2G),速度为 1.3GB/s
    2500000 的时候(10G),速度为 950MB/s
    3000000(12g),速度为 600MB。
    用了 lvm 来管理硬盘,感觉有点怪异。超过 6.6G 之后,拷贝性能下降非常大,是不是我文件系统有点问题?
    第一次观察这个值,不知道大家的是什么情况。该如何解决这个问题呢?
    3,4 亿条 400 多秒,太让人羡慕了。那个帖子也很有价值。
    cstj0505
        9
    cstj0505  
       2018-07-18 09:09:01 +08:00
    @sjmcefc2 忘了说了,linux 写磁盘的话会先写的缓存,所以文件小的话直接落在内存缓存了,看起来速度比较快。你测试的时候最好是写入大于内存的文件,我们一般 1.5 或者 2 倍,然后还有直接写磁盘不落缓存的参数,你可以看看,这样是比较接近于真是 io 的速度。

    你如果用分区表的话,可以换普通表试试。
    sjmcefc2
        10
    sjmcefc2  
    OP
       2018-07-21 09:57:06 +08:00
    @cstj0505 非常感谢您的提示。我的机器 32g 内存,是不是说可以用 32g*2=64g 的来测试,那样的话估计速度就很慢了。现在 12g 都只有 600mb 了,我很多要导入的文件要 40g。有点想知道,我这样的硬盘速度是不是有点不太正常?大家真正的 io 速度是多少呢
    sjmcefc2
        11
    sjmcefc2  
    OP
       2018-07-22 00:33:28 +08:00
    @cstj0505
    这样的 iostat,是不是说根本没有发挥出机器性能?
    看着写入才 156kb/s,用 top 看资源,cpu 基本都是空闲的。
    pgAdmin4 的 dashboard 上面,显示 1000 transaction per second。不过不太知道 pgadmin 的 dashboard 有什么含义。

    大家能帮忙给看下问题在哪里呢?谢谢。

    Linux 3.10.0-693.el7.x86_64 (localhost.localdomain) 2018 年 07 月 21 日 x86_64 (8 CPU)

    avg-cpu: %user %nice %system %iowait %steal %idle

    0.16 0.00 0.10 0.01 0.00 99.73

    Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn

    sdb 0.50 1.00 156.12 191276 29798188

    sda 0.36 2.69 1.26 513513 240387

    sde 0.06 0.01 0.00 2668 0

    sdd 0.10 0.59 0.61 113024 116556

    sdc 0.07 0.01 2.38 2692 454700

    dm-0 0.21 2.35 1.21 448851 230066

    dm-1 0.00 0.01 0.00 2228 0

    dm-2 0.52 1.73 159.16 329496 30377680
    cstj0505
        12
    cstj0505  
       2018-07-23 09:15:48 +08:00
    @sjmcefc2 一般机械盘的顺序写入的话是在 150MB/s 左右。

    你写入的时候是用 jdbc 批量写入的吗。jdbc 有个 copy manager 的 api,你可以查一下用法,基本上能接近你的硬盘 io 上限
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2577 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 04:44 · PVG 12:44 · LAX 20:44 · JFK 23:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.