第31章 Loki 配合 Extstore 的深度调优指南
AdvisoriesLoki with ExtstoreLoki with ExtstoreGrafana Loki with Extstore 你可能已经看过这篇很棒的文章:https://grafana.com/blog/2023/08/23/how-we-scaled-grafana-cloud-logs-memcached-cluster-to-50tb-and-improved-reliability/……并尝试将这些经验付诸实践,但结果却不太对劲。本文会帮你快速上手,让 Loki 与 Extstore 配合得更好。TLDR 假设你的 Loki chunk 存储大小为 1.5mb。对于 memcached,至少需要添加以下调优参数:-I 2m -o ext_wbuf_size=32,ext_threads=10,ext_max_sleep=10000,slab_automove_freeratio=0.10,ext_recache_rate=0也就是说,完整的启动命令可能像这样:memcached -m 6000 -I 2m -o ext_path=/disk/extstore:500G,ext_wbuf_size=32,ext_threads=10,ext_max_sleep=10000,slab_automove_freeratio=0.10,ext_recache_rate=0请根据你的系统合理设置 -m 和 ext_path,给系统留出一些内存余量,磁盘上也要留一点空间余量。请使用 1.6.21 或更新版本,它提升了 extstore 的写入速度,并修复了一些相关 bug。在 loki 配置中:chunk_store_config: chunk_cache_config: memcached: batch_size: 3 parallelism: 2 memcached_client: addresses: 127.0.0.1:11211 timeout: 60s background: writeback_goroutines: 1 writeback_buffer: 1000 writeback_size_limit: 500MB注意:batch_size 可以设置为 memcached 服务器数量的 2 倍。比如有 3 台服务器,设为 6 即可。parallelism 尽量保持较低,只有当 memcached 的网络带宽还没跑满时才增大它。Loki 的默认配置非常激进,这对纯内存型的 memcached 通常没问题。但 extstore 从磁盘读取或写入需要多花一点时间。最后,请确认 memcached 和 Loki 实例没有发生 swap(内存不足)或 CPU 饱和,否则会拉长查询时间并导致超时。为什么要调这些参数 Loki 的默认值基于两个假设:A)集群是纯内存 backed 的,B)缓存节点规模可能很大,从几十到几百个。而很多用户只部署了少量 memcached 节点(1-3 个)搭配 extstore 使用。Loki 从 memcached 服务器池中取 key 时,会一次性向整个池发送一批 batch_size 数量的 key。比如 batch_size 为 500、有 40 台 memcached 时,这一批会被拆分,每台同时收到 12-14 个 key。如果只对着 1 台服务器取 500 个 key,那就是一大批 key 同时压到单台服务器上。这还会带来其他问题,本文暂不展开讨论。Memcached 调优说明 extstore 的默认参数相当保守。最显著的性能提升来自调高 ext_threads,这样能充分发挥 SSD 的能力。如果你的 SSD 特别快,线程数还可以进一步调到 20 或 30。memcached 的工作线程数由 -t 指定,默认为 4,不要设得高于服务器的 CPU 核数。其余调优参数只能带来小幅提升。Loki 调优说明 前面已经讨论过 batch_size 的问题。此外可以看到 timeout 被设得很高,原因有几个:Loki 的 memcache 客户端 timeout 度量的是从每台主机上取回、读取并处理整批 key 的总耗时。如果只从一台主机取 2 个 key(3MB 数据),100ms 的默认值看起来没问题。但如果要从单台主机的 SSD 上跨网络取回 500 个 1.5MB 的 key,可能需要相当长的时间。memcached 主机越少,或者 Loki 服务器 CPU 不够强、处理结果不够快,这个 timeout 就需要设得越高。情况有变时我们会更新本文。writeback_goroutines: 1默认值是 10。Loki 在每次查询时会非常激进地把从后端存储取到的数据全部写回 memcached。而 memcached 会预留一部分内存作为缓冲区,用来给数据落盘争取时间。如果写入磁盘的速度跟不上,就会看到 evictions 计数上升。目前没有太多好的解决办法,但把这个值设为 1 有助于把影响降到最低。如果仍然出现 evictions 问题,可能需要升级到更快的 memcached 实例,或者增加实例数量。有任何变化我们都会更新本文。UDP DDoS