当前位置:首页 > 内存 > 正文

es集群内存使用率多少会影响写入

  • 内存
  • 2024-08-28 16:01:28
  • 2124

一、I510400配微星B560PRO-E最大支持2666频率内存吗?

1B560已开放内存频率限制只要内存质量足够,主板规格表中的频率即可。

2网上查了一下,有人用i5-10400F搭配B560M-Apro内存频率,启用XMP来实现DDR4-3600。


二、Prometheus指标写入ES间断问题排查

由于Prometheus容量有限,不适合存储大量数据,因此需要将数据写入远程存储。由于对ES比较熟悉,所以选择ES作为远程存储,适配器选择prometheus-es-adapter。
环境搭建好后,我很快就看到数据流入ES,我想就这样了。然而第二天我发现数据只记录了半个小时就被中断了。。

经过初步排查,发现prometheus-es-adapter由于OOMKilled(内存溢出)而崩溃,于是我将cpu增加到1000m,内存增加到1Gi,然后正常运行。
但是观察了半天,发现数据记录经常会出现长时间的中断,如下图:

因为我目前接触Prometheus比较少,所以询问了我的运维同学提问。Wei测试了Prometheus配置后指出,可能是remote__ty设置太小,导致大量数据来不及写入ES就被丢弃。下面的默认容量是10:

所以我将remote__ty增加到1000:

但是没有用。如果这个过程被认为是生产者-消费者模型,那么Prometheus就是生产者,prometheus-es-adapter就是消费者。因为问题不在于Prometheus,而可能在于prometheus-es-adapter。所以我按照文档设置环境变量DEBUG=true来启用调试模式。

可以正常看到日志输出,说明prometheus-es-adapter收到了数据,并尝试写入ES,但是为什么ES没有收到数据呢?(仔细观察发现ES正在写数据但是速度很慢)

所以我猜测:prometheus-es-adapter将数据写入队列并等待数据达到一定的级别程度,然后写数量怎么样?还是消费线程太少导致大量消息无法处理和累积?如果真是这样的话,肯定会占用大量内存,内存空闲速度肯定会下降。这也可以解释之前经历的OOMKilled情况。
于是我使用watch命令来监控prometheus-es-adapter容器的内存空闲率:

下面两张图是5分钟观察的结果。内存空闲速度不断降低。

所以我尝试将ES_WORKERS增加到20,果然过了一段时间数据就跟上了。

该问题的根本原因是:prometheus-es-adapter处理线程太少,导致数据没有及时写入ES,导致Prometheus队列填满,数据被丢弃discarded或者在处理过程中大量积累在prometheus-es-adapter中。这也是为什么只有一段时间的数据,以及出现prometheus-es-adapterOOMKilled的原因。
要解决这个问题,需要修改两个位置: