适用版本: 7.13-8.x
1. 错误异常的基本描述 #
unable to parse [{}={}] as either percentage or bytes 表示 Elasticsearch 在解析某个配置项时,发现其值既不是合法的百分比格式,也不是合法的字节大小格式。该异常通常在节点启动、动态更新集群设置(cluster settings API)或加载 elasticsearch.yml 配置时抛出。
Elasticsearch 中有多个配置项同时支持百分比和字节两种写法,例如:
- 磁盘水位线:
cluster.routing.allocation.disk.watermark.low - 断路器设置:
indices.breaker.total.limit - 缓存大小:
indices.queries.cache.size
当这些配置项被赋予一个无法识别的值时,就会触发此异常。
常见现象 #
- 节点启动失败,日志中出现
unable to parse异常,节点无法正常加入集群。 - 通过
PUT /_cluster/settings动态更新配置时,API 返回400错误,提示无法解析设置值。 - 配置值由自动化脚本或部署模板渲染生成时,变量为空或格式错误,导致写入非法值。
- 异常日志中会明确打印出
settingName和原始值,便于定位具体是哪个配置项出现问题。
典型报错与异常栈 #
illegal_argument_exception: unable to parse [cluster.routing.allocation.disk.watermark.low=85] as either percentage or bytes
Caused by: ElasticsearchParseException: unable to parse [cluster.routing.allocation.disk.watermark.low=85] as either percentage or bytes
at org.elasticsearch.common.unit.ByteSizeValue.parseBytesSizeValue(ByteSizeValue.java:...)
at org.elasticsearch.common.settings.Setting.parse(Setting.java:...)
2. 为什么会发生这个错误 #
该异常的根本原因是配置值未遵循 Elasticsearch 对百分比或字节格式的语法要求。常见原因包括:
- 百分比格式错误:写成了
85、0.85、85percent、百分之85等非标准写法,正确格式应为85%。 - 字节格式错误:写成了
50 GB(含空格)、10mbs(单位不支持)、2gib(大小写错误)、500(无单位)等,正确格式应为50gb、10mb、2g、500b。 - 空值或变量未渲染:在自动化部署场景中,模板变量为空,最终配置项变成
setting=的形式,值为空字符串。 - 单位不支持:使用了 Elasticsearch 不支持的单位缩写,如
1kb正确,但1kib、1k在某些情况下不被接受。 - 多值配置格式错误:磁盘水位线支持同时设置百分比和字节值(用逗号分隔),若分隔符或格式错误也会触发异常。
3. 如何排查和解决这个异常 #
建议按以下步骤排查:
- 从异常日志中确认具体的配置项名称(
settingName)和当前值(value)。 - 对照 Elasticsearch 官方文档 确认该设置支持的格式。
- 检查配置来源:是
elasticsearch.yml静态配置、还是通过cluster settings API动态设置,亦或是部署模板渲染结果。 - 如果是自动化脚本生成的值,打印最终渲染的配置字符串,确认变量替换是否正确。
- 在测试环境用标准示例值(如
85%、50gb)逐个替换,确认合法格式后再应用到生产环境。
排查时需要注意的问题 #
- 不要只看报错表面的配置项名称,要确认值的完整字符串,包括是否有不可见字符、空格或换行。
- 如果配置由 Ansible、Terraform、Helm 等工具管理,检查模板文件和变量文件的对应关系。
- 磁盘水位线等设置支持同时指定百分比和字节值(逗号分隔),确认分隔符是否为英文逗号,且两部分格式均正确。
4. 如何解决这个错误 #
常用修复思路 #
- 百分比写法:统一写成
85%、90%这样的标准形式,不要省略%符号。 - 字节写法:使用 Elasticsearch 支持的单位:
b、kb、mb、gb、tb、pb,且单位前不加空格,如50gb、500mb。 - 避免非法字符:确保配置值前后无空格、无不可见字符、无多余引号。
- 多值配置:如磁盘水位线同时设置百分比和字节值,格式为
85%,50gb,两部分均须合法。 - 自动化场景:为配置生成逻辑增加格式校验,在写入集群设置前验证值的合法性。
正确配置示例 #
# elasticsearch.yml 静态配置示例
cluster.routing.allocation.disk.watermark.low: 85%
cluster.routing.allocation.disk.watermark.high: 90%
cluster.routing.allocation.disk.watermark.flood_stage: 95%
indices.breaker.total.limit: 70%
indices.queries.cache.size: 10%
# 通过 API 动态更新配置
PUT /_cluster/settings
{
"persistent": {
"cluster.routing.allocation.disk.watermark.low": "85%",
"indices.breaker.total.limit": "70%"
}
}
后续注意事项与推荐建议 #
- 在 CI/CD 流水线中加入配置文件格式校验步骤,避免非法值被推送到生产环境。
- 对关键配置项(磁盘水位线、断路器、缓存大小)建立监控和告警,配置变更时主动通知。
- 使用 INFINI Console 查看集群设置和变更历史,快速定位配置问题。
借助 INFINI 产品提升排障效率 #
- INFINI Console 适合查看集群健康度、节点指标、配置变更历史和错误趋势,帮助快速判断异常是配置问题还是系统性问题。
- INFINI Gateway 适合部署在 Elasticsearch 前面做请求观测、限流和流量治理,减少因配置错误导致的集群不稳定风险。
5. 小结 #
unable to parse [{}={}] as either percentage or bytes 说明配置值既不符合百分比格式,也不符合字节大小格式。修复方法非常明确:确认具体配置项后,将其值改为 Elasticsearch 支持的标准格式(百分比加 %,字节加支持的单位且无空格),即可立即解决问题。
对于自动化部署场景,建议在配置生成环节增加格式校验,从源头避免此类问题的发生。
相关错误 #
- can-t-round-a-bytes:无法对 BYTES 类型做 rounding
- failed-to-parse-request:请求解析失败
- missing-location:仓库缺少 location 配置
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
}
}
try {
return new RelativeByteSizeValue(ByteSizeValue.parseBytesSizeValue(value, settingName));
} catch (ElasticsearchParseException e) {
throw new ElasticsearchParseException("unable to parse [{}={}] as either percentage or bytes", e, settingName, value);
}
}
public String getStringRep() {
if (ratio != null) {





