You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS ECS优化Debian系统下Logstash无因CPU占满100%求助

解决Logstash在AWS ECS优化Debian AMI上CPU占用100%的问题

结合你的场景(简单配置却CPU跑满),我给你几个针对性的排查和解决方向:

1. 优化File输入的扫描逻辑

你的配置里用了/home/ec2-user/**/*.*和/var/log/ecs/*.*这种递归+全文件匹配,很容易让Logstash陷入**无差别扫描大量文件(包括临时文件、缓存文件)**的循环,导致CPU飙升。可以这么调整:

  • 排除临时/无用文件:在每个file输入里加exclude => ["*.tmp", "*.swp", "*.cache"],减少扫描范围
  • 固定sincedb路径:默认sincedb存在临时目录,重启Logstash会重新扫描所有文件,加上sincedb_path => "/var/lib/logstash/sincedb"(先创建这个目录并给logstash用户权限),让Logstash记住已读取的文件位置
  • 降低扫描频率:调整stat_interval => 10(每10秒检查文件变化)和discover_interval => 30(每30秒发现新文件),减少不必要的系统调用

调整后的input示例:

input { 
  file { 
    path => "/home/ec2-user/**/*.*"
    exclude => ["*.tmp", "*.swp"]
    sincedb_path => "/var/lib/logstash/sincedb"
    stat_interval => 10
    discover_interval => 30
  } 
  file { 
    path => "/var/log/ecs/*.log"
    sincedb_path => "/var/lib/logstash/sincedb"
    stat_interval => 10
    discover_interval => 30
  } 
}

2. 调整JVM堆内存配置

Logstash基于Java,默认JVM参数可能不适合AWS ECS实例的资源:

  1. 编辑/etc/logstash/jvm.options
  2. 修改堆内存大小,比如你的实例是2G内存的话,改成:
    -Xms2g
    -Xmx2g
    
    (如果是更大的实例,比如4G内存可以设为-Xms3g -Xmx3g,不要超过实例内存的70%)
  3. 可以加上GC日志帮助排查:
    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps
    -XX:+PrintGCDateStamps
    -Xloggc:/var/log/logstash/gc.log
    
  4. 重启Logstash后,用jstat -gc <logstash-pid>观察GC情况,如果GC频繁说明堆内存还需要调整

3. 改用Systemd管理Logstash进程

你用&后台启动的方式很容易导致进程管理混乱,而且环境变量可能没正确传递。建议用systemd托管:

  1. 创建/etc/systemd/system/logstash.service文件:
    [Unit]
    Description=Logstash Service
    After=network.target
    
    [Service]
    Type=simple
    User=logstash
    Group=logstash
    Environment="CLUSTER=${CLUSTER}" "INSTANCEID=${INSTANCEID}"
    ExecStart=/usr/share/logstash/bin/logstash -f /etc/logstash/logstash.conf --path.settings /etc/logstash/
    Restart=always
    RestartSec=5
    
    [Install]
    WantedBy=multi-user.target
    
  2. 执行命令生效:
    sudo mkdir -p /var/lib/logstash
    sudo chown logstash:logstash /var/lib/logstash
    sudo systemctl daemon-reload
    sudo systemctl enable logstash
    sudo systemctl start logstash
    

这样不仅进程更稳定,还能通过journalctl -u logstash -f实时查看日志,方便排查问题

4. 排查日志文件的异常情况

检查/var/log/ecs/下的日志是不是高频滚动或者无限增长?比如ecs-agent的日志如果每秒生成大量内容,会让Logstash持续读取导致CPU高。可以:

  • 只匹配.log后缀的文件(如上面input调整的那样),避免处理日志归档文件(比如.gz)
  • 查看ECS Agent的日志配置,限制日志大小和滚动数量,避免日志爆炸

5. 确认环境变量是否正确传递

你的filter里用了${CLUSTER}和${INSTANCEID},如果这两个变量没正确传递给Logstash,可能导致filter逻辑异常(比如反复尝试解析空变量)。可以:

  • 在启动前先确认变量存在:echo $CLUSTER && echo $INSTANCEID
  • 如果是通过用户数据启动,确保变量在启动命令前已经定义,比如:
    export CLUSTER=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//')
    export INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
    /usr/share/logstash/bin/logstash -f /etc/logstash/logstash.conf --path.settings /etc/logstash/
    

先从这几个方向入手排查,应该能定位到CPU高的原因。

内容的提问来源于stack exchange,提问作者FixXxeR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:08:54