• KUDU响应时间长,IO调优


    最近出现KUDU查询耗时一段时间非常长,差不多在3-5s左右。

    1.问题排查

    看到机器的以下监控数据,在出问题期间,IO量很大,IO占用CPU时间基本打满,明显是存在磁盘IO问题。

    进一步发现内存占用已到90%以上。使用

    pidstat -d 1

    统计进程的磁盘读写情况,发现kudu-tserver均值可到100多M每秒,明显定位到IO问题出现kudu上。

    2.第一阶段解决方案

    由于内存占用过高,所以先释放一些机器内存(通过迁移其他进程)。

    继续观察数据。

    用户请求量趋势:

     IO操作趋势:

     读写速率趋势:

     可以看到不再出现IO很高的情况,但依然IO的量很大,在用户数达到一定量时,IO明显增多。

    此时考虑Kudu本身确实存在IO问题,磁盘读写过于频繁,尤其是写操作。

    3.kudu核心原理

    kudu的数据存储这块原理,核心要素实际上与MySQL这类数据库类似,有两个重要概念:LSM和WAL。

    LSM:存储形式是内存+磁盘,写入时先写内存,内存中以LSM组织数据,刷脏页的形式落盘。

    WAL:写数据前先写log,log是顺序写所以IO效率高,再写data。

    监控数据也看到是写入的IO操作量非常大。kudu的刷脏操作过于频繁,且量很大,接着尝试看能否优化。

    4.第二阶段优化

    查看kudu进程信息:

    kudu 758 1 3 Sep29 ? 00:42:07 /usr/lib/kudu/sbin/kudu-tserver --server_dump_info_path=/var/run/kudu/kudu-tserver-kudu.json --flagfile=/etc/kudu/conf/tserver.gflagfile kudu 1824 1 0 2021 ? 14:56:07 /usr/lib/kudu/sbin/kudu-master --server_dump_info_path=/var/run/kudu/kudu-master-kudu.json --flagfile=/etc/kudu/conf/master.gflagfile

    上文确认过IO来自进程kudu-tserver,看下配置/etc/kudu/conf/tserver.gflagfile:

    1. # Do not modify these two lines. If you wish to change these variables,
    2. # modify them in /etc/default/kudu-tserver.
    3. --fromenv=rpc_bind_addresses
    4. --fromenv=log_dir
    5. --fs_wal_dir=/data/var/lib/kudu/tserver
    6. --fs_data_dirs=/data/var/lib/kudu/tserver
    7. --tserver_master_addrs=xxxx:3332
    8. --unlock_unsafe_flags=true
    9. --allow_unsafe_replication_factor=true
    10. --default_num_replicas=1
    11. --webserver_port=8894
    12. --tablet_history_max_age_sec=900

    没看到跟内存配置相关的,其他也没看出有带来IO压力很大的配置。

    IO瓶颈可以考虑硬件和软件两个方面,因为使用的是云上机器,磁盘是也是通用的,不考虑优化这块,所以从软件出发,看看能否减轻kudu的刷盘压力。

    查阅kudu的优化参数:Apache Kudu - Apache Kudu Troubleshooting

    默认值优化值
    –block_cache_capacity_mb512512读缓存。不要超过memory_pressure_percentage,相当于memory_limit_hard_bytes的30%。机器只赋予4G给kudu使用,所以分配1G。
    –-memory_limit_hard_bytes42949672962048*1024*1024硬限制,kudu只能占用这么多内存
    –maintenance_manager_num_threads13维护管理器线程池的大小。对于旋转磁盘,线程数不应超过设备数。(官网建议的维护管理器线程数是数据目录的3倍)
    –default_num_replicas31
    –log_dir/tmp
    –memory_pressure_percentage60%影响刷盘
    –memory_limit_soft_percentage80%超出这个值后会拒绝写入

    添加如下几个参数,重启kudu-tserver。

    1. --block_cache_capacity_mb=512
    2. –-memory_limit_hard_bytes=2147483648
    3. --maintenance_manager_num_threads=3

    调整后IO情况,可以看到有很明显的变化:

  • 相关阅读:
    【微信小程序】swiper和swiper-item组件的基本使用
    机器视觉公司还是招人?
    【Leetcode】1017. Convert to Base -2
    Fiddler抓包原理和使用详解
    解决Github上的README无法显示图片
    【PDF合并】利用 Python 合并 PDF 文件
    Vite3 + Svelte3构建Web应用报错:‘process is not defined‘
    【FLink】Flink 任务 如何优雅的停止
    【SpringBoot AOP Redis实现延时双删功能实战】
    C++每日面经
  • 原文地址:https://blog.csdn.net/feng_zi0yhv/article/details/127120675