Elasticsearch报No space left on device错误的原因及解决方法
Elasticsearch 8.4.1运行报
java.io.IOException: No space left on device错误排查与解决 问题背景
在Ubuntu 22.04虚拟机中安装了Elasticsearch和Kibana 8.4.1,虚拟机配置为2G内存、50G磁盘空间、2核CPU,运行Elasticsearch时出现如下错误:
java.io.IOException: No space left on device
相关服务状态信息:
elastic@elqstic:~$ sudo systemctl status elasticsearch.service [sudo] password for elastic: ● elasticsearch.service - Elasticsearch Loaded: loaded (/lib/systemd/system/elasticsearch.service; enabled; vendor preset: enabled) Active: active (running) since Thu 2022-09-15 11:10:54 UTC; 48min ago Docs: https://www.elastic.co Main PID: 1459 (java) Tasks: 91 (limit: 2196) Memory: 1005.3M CPU: 4min 46.879s CGroup: /system.slice/elasticsearch.service ├─1459 /usr/share/elasticsearch/jdk/bin/java -Xms4m -Xmx64m -XX:+UseSerialGC -Dcli.name=server -Dcli.script=/usr/share/elasticsearch/bin/elasticsearch -Dc> ├─1519 /usr/share/elasticsearch/jdk/bin/java -Des.networkaddress.cache.ttl=60 -Des.networkaddress.cache.negative.ttl=10 -Djava.security.manager=allow -XX:> └─1540 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at org.elasticsearch.ingest.geoip@8.4.1/org.elasticsearch.ingest.geoip.DatabaseNodeService.lambda$retrieveD> sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at org.elasticsearch.server@8.4.1/org.elasticsearch.common.util.concurrent.ThreadContext$ContextPreservingR> sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at java.base/java.lang.Thread.run(Thread.java:833) sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: Caused by: java.io.IOException: No space left on device sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at java.base/java.io.FileOutputStream.writeBytes(Native Method) sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at java.base/java.io.FileOutputStream.write(FileOutputStream.java:349) sept. 15 11:11:03 elqstic systemd-entrypoint[1519]: at org.apache.logging.log4j.core@8.4.1/org.apache.logging.log4j.core.appender.OutputStreamManager.writeToDe>
错误原因
虽然虚拟机分配了50G磁盘,但实际可用磁盘空间已耗尽,常见触发场景:
- Elasticsearch日志未配置滚动策略,长期积累占用大量空间;或GeoIP数据库下载过程中占用临时空间未释放
- 虚拟机磁盘扩容后未同步扩展系统分区,导致实际可用空间仍为初始小容量
- 系统临时文件、其他应用占用了大量磁盘空间
解决步骤
1. 排查磁盘占用情况
- 执行以下命令查看全部分区的空间使用情况,定位满额分区:
df -h - 查看Elasticsearch核心目录(日志、数据)的占用情况:
sudo du -sh /var/log/elasticsearch /var/lib/elasticsearch
2. 紧急释放磁盘空间
- 删除Elasticsearch的旧日志归档文件(不要删除正在写入的
.log文件):sudo rm -rf /var/log/elasticsearch/*.*.gz - 清理系统临时文件:
sudo rm -rf /tmp/*
3. 优化Elasticsearch配置避免重复占用
- 修改日志滚动策略:编辑
/etc/elasticsearch/log4j2.properties,配置日志保留天数和单文件大小限制:appender.rolling.strategy.type = TimeBasedTriggeringPolicy appender.rolling.strategy.interval = 1 appender.rolling.strategy.max = 7 - 若不需要GeoIP功能,直接禁用对应插件以避免数据库下载占用空间:
sudo elasticsearch-plugin remove ingest-geoip
4. 扩容磁盘空间(若确实容量不足)
- 先在虚拟机管理界面扩展磁盘容量至足够大小
- 在Ubuntu中扩展分区:
# 假设磁盘为/dev/sda,分区为/dev/sda1 sudo growpart /dev/sda 1 sudo resize2fs /dev/sda1
内容的提问来源于stack exchange,提问作者morad della3
相关产品推荐
相关产品推荐

