本文介绍使用ACK集群调度策略时可能遇到的常见问题及对应的解决方案。
分类 | 说明 | 跳转链接 |
通用 | 调度常见问题 | |
负载感知调度 | ||
QoS | ||
ack-koordinator组件相关问题 | ||
重调度 | ||
其他 |
常见FAQ
如何防止虚拟交换机IP不足导致Pod启动失败?
问题原因
原生Kubernetes集群调度器无法感知节点的剩余IP,这导致即使在集群IP资源不足、Pod启动失败的情况下,系统仍会尝试将Pod调度到这些节点上,短时间内产生大量异常Pod。
解决方案
为了解决这一问题,ACK调度器引入了k8s.aliyun.com/max-available-ip
注解来标记每个节点的最大可用IP数量,并据此以及Pod是否需要独立IP地址来限制可调度至该节点的Pod数量。此外,当检测到某个节点出现IP资源耗尽时,通过更新节点状态中的SufficientIP
的Condition,阻止进一步向该节点调度需要独立IP地址的新Pod,从而有效避免了因IP资源不足而引发的大规模Pod故障情况。
此功能是kube-scheduler组件自动启用的功能。但您的集群及kube-scheduler组件需满足以下条件:
集群为ACK托管集群Pro版,且集群网络插件为Terway,Terway版本为v1.5.7及以上。详细信息,请参见创建ACK托管集群。
kube-scheduler版本需满足如下要求。
集群版本
kube-scheduler版本
1.30及以上
所有版本均可支持
1.28
v1.28.3-aliyun-6.3及以上
1.26
v1.26.3-aliyun-6.3及以上
1.24
v1.24.6-aliyun-6.3及以上
1.22
v1.22.15-aliyun-6.3及以上
如何将ack-descheduler迁移至Koordinator Descheduler?
ack-descheduler已停止维护,请参见【组件公告】ack-descheduler组件迁移公告。建议您迁移至当前维护的组件模块Koordinator Descheduler。迁移流程与迁移Kubernetes Descheduler至Koordinator Descheduler的流程类似,请参见迁移Kubernetes Descheduler至Koordinator Descheduler完成迁移。
容器服务 Kubernetes 版在应用市场中提供了重调度应用ack-descheduler组件。该组件是对社区Kubernetes Descheduler的封装,目前提供0.20.0和0.27.1两个版本,其功能和使用方法均与社区Kubernetes Descheduler 0.20.0以及0.27.1保持一致。
ACK Scheduler的默认调度策略是什么?
在ACK集群中,ACK Scheduler的默认调度策略与社区Kubernetes调度器保持一致。Kubernetes调度器决定如何将Pod调度到某个节点时,通常包括两个关键步骤:Filter(过滤)和Score(评分)。
Filter:过滤哪些节点可以被调度的。如果过滤后的列表为空,则表明Pod当前无法被调度。
Score:过滤后,调度器将对可供调度的节点进行打分和排名,从而选择一个最适合放置Pod的节点。
关于ACK Scheduler最新版本中开启的Filter和Score插件,请参见Filter及Score插件介绍。
如何在Pod调度过程中,规避利用率热点节点?
在Kubernetes原生调度策略中,调度器主要基于节点资源的分配情况(资源Request)进行调度,并不会参考节点的真实利用率情况。此外,调度器还有多种Filter(过滤)和Score(评分)插件,共同影响着调度结果。推荐您使用ACK集群提供的如下功能,避免Pod被调度到热点节点上。
为每个Pod配置合理的资源Request和Limit,规划资源冗余。您可以使用资源画像功能,基于对资源使用量历史数据的分析获取容器规格的推荐配置。更多信息,请参见资源画像。
启用负载感知调度功能。负载感知调度是ACK调度器Kube Scheduler基于Kubernetes Scheduling Framework实现的插件。与Kubernetes原生调度策略不同的是,ACK Scheduler可以感知节点实际的资源使用情况,通过参考节点负载的历史数据并对新调度Pod进行预估,将Pod优先调度到负载较低的节点,实现节点的负载均衡。更多信息,请参见使用负载感知调度。
启用负载热点打散重调度功能。节点的利用率会随着时间、集群环境变化、工作负载的流量或请求等动态变化,从而导致集群内节点间原本的负载均衡被打破。此外,ACK Scheduler还提供了重调度能力,防止负载出现极端不均衡的情况。更多信息,请参见使用负载热点打散重调度。
集群中新增了一个节点,但Pod为什么始终没有调度到这台节点上去?
此现象可能由多种原因导致。您可以按照如下流程进行排查。
检查节点状态是否正常。若节点处于NotReady状态,表明节点仍未就绪。
检查Pod是否设置了不合适的调度策略(NodeSelector、NodeAffinity、PodAffinity)或存在污点等情况,导致Pod无法被调度到新节点。
评估是否为Kubernetes原生调度策略问题。在Kubernetes原生调度策略中,调度器主要基于节点资源的分配情况(资源Request)进行调度,并不会参考节点的真实利用率情况,所以可能会出现某些节点上运行的Pod很多,某些节点上运行的Pod很少或没有。
您可以参见如何在Pod调度过程中,规避利用率热点节点?提供的解决方案解决此问题。
集群中CPU或内存使用率不高,但调度时会提示CPU或内存资源不足
在Kubernetes原生调度策略中,调度器主要基于节点资源的分配情况(资源Request)进行调度,并不会参考节点的真实资源使用率,所以即使集群CPU真实使用率不高,但仍有可能出现Pod调度时因CPU、内存资源不足(Insufficient CPU或Insufficient Memory)而调度失败的情况。
您可以参见如何在Pod调度过程中,规避利用率热点节点?提供的解决方案解决此问题。
在ACK中使用重调度功能有哪些注意事项?是否会重启Pod?
ACK通过Koordinator Descheduler提供重调度功能,在使用重调度功能时,有如下注意事项。
Koordinator Descheduler只负责驱逐正在运行的Pod,并不负责Pod驱逐后的重建以及调度。Pod被驱逐后的重建由其工作负载对应的Controller实现(例如Deployment、StatefulSet),重建后Pod的调度流程仍然由调度器负责。
重调度在执行过程中会先驱逐旧Pod,再创建新Pod。请确保您的应用有充足的冗余副本(
replicas
),避免驱逐时影响应用可用性。
更多信息,请参见重调度。
如何将应用调度到指定的节点上?
您可以为节点设置标签,然后在应用YAML中添加对应的nodeSelector,调度应用到指定节点。具体操作,请参见调度应用至指定节点。
在一个Deployment中,如何指定一定数量的Pod调度到ECS,一定数量的Pod调度到ECI?
在ECS、ECI资源混合使用场景的下,您可以通过UnitedDeployment的方式定义Subset,对工作负载进行管理。例如,您可以在UnitedDeployment的YAML中指定subset-ecs中的replicas
为10
,subset-eci中的replicas
为10
。详细信息,请参见基于UnitedDeployment实现工作负载的伸缩。
如何让一个工作负载的Pod在调度时满足高可用?
您可以通过Pod亲和性的方式,将一个工作负载的Pod打散到不同可用区或节点。例如,您可以参见下方YAML为Pod添加如下字段,声明一个preferredDuringSchedulingIgnoredDuringExecution
“偏好”规则,尝试将具有 security=S2
Label的Pod分散调度到不同的可用区(zone)内,并在无法满足此条件时,再次尝试将该Pod调度到其他节点上。
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S2
topologyKey: topology.kubernetes.io/zone
详细信息,请参见Kubernetes官方文档podAffinity和podAntiAffinity、拓扑分布约束(Topology Spread Constraints)。
负载感知调度FAQ
对于一批新创建的Pod,为什么没有全部调度到负载最低的节点?
如果调度器将一批新创建的Pod全部调度到当前负载最低的节点,那么这个节点反而可能很快就会成为负载热点,这是因为新Pod在启动后会增加节点的负载。
因此,负载感知调度插件在计算节点打分时,若节点中有利用率还未上报的新Pod,会对打分结果进行适当调整,避免过量调度而产生新的热点。
除了节点负载水位,还有哪些因素会影响调度结果?
K8s调度器由多个插件组成,在调度过程中很多插件都会参与到节点排序的打分计算,例如亲和性插件、拓扑分布插件,节点的最终排序会受这些插件共同影响,您可以根据实际情况,按需调整各插件的打分权重。
调度器升级为新版本后,是否继续支持已通过旧版本协议使用的负载感知调度功能?
如需使用旧版本的负载感知调度功能,需为Pod添加Annotation alibabacloud.com/loadAwareScheduleEnabled: "true"
。
ACK调度器兼容旧版本协议,您可无缝升级至新版本。升级后,建议您通过步骤一:开启负载感知调度为调度器开启全局的负载均衡调度策略,以减少对Pod配置的改动。
ACK调度器在1.22版本将持续保持对旧版本协议的兼容,在1.24版本的兼容期限截止至2023年08月30日。建议您升级集群版本,并使用新版本的负载感知调度功能配置方式。关于集群升级,请参见手动升级集群。
各版本协议的支持情况和组件版本具体要求如下。
1.26及以上
ACK调度器版本 | ack-koordinator(ack-slo-manager)版本要求 | Pod Annotation协议 | 控制台参数配置开关 |
所有ACK调度器版本 | ≥1.1.1-ack.1 | 不支持 | 支持 |
1.24
ACK调度器版本 | ack-koordinator(ack-slo-manager)版本要求 | Pod Annotation协议 | 控制台参数配置开关 |
≥v1.24.6-ack-4.0 | ≥1.1.1-ack.1 | 支持 | 支持 |
≥v1.24.6-ack-3.1且<v1.24.6-ack-4.0 | ≥0.8.0 | 支持 | 不支持 |
1.22及以下
ACK调度器版本 | ack-koordinator(ack-slo-manager)版本要求 | Pod Annotation协议 | 控制台参数配置开关 |
≥1.22.15-ack-4.0 | ≥1.1.1-ack.1 | 支持 | 支持 |
≥1.22.15-ack-2.0且<1.22.15-ack-4.0 | ≥0.8.0 | 支持 | 不支持 |
| ≥0.3.0且<0.8.0 | 支持 | 不支持 |
QOS FAQ
开启CPU Burst配置后,为什么Pod仍有CPU Throttled现象出现?
通常会有以下几个原因,您可以参考以下说明进行调整。
配置格式错误,导致CPU Burst策略没有生效,请参见高级参数配置修改并验证。
CPU利用率达到
cfsQuotaBurstPercent
配置的上限时,由于CPU资源不足,仍会出现CPU Throttled现象。建议您根据应用实际需求情况调整Reqeuest和Limit值。
CPU Burst策略会调整Pod的两个cgroup参数:
cpu.cfs_quota_us
和cpu.cfs_burst_us
,详情请参见高级参数配置。其中,cpu.cfs_quota_us
在ack-koordinator感知到CPU Throttled后才会进行设置,存在少许延迟;而cpu.cfs_burst_us
直接参考配置进行设置,效果更灵敏。建议您搭配Alibaba Cloud Linux操作系统使用,效果更佳。
CPU Burst策略在调整
cpu.cfs_quota_us
时会有保护机制,即整机安全水位阈值配置的sharePoolThresholdPercent
。当整机利用率过高时,为了避免单个Pod产生更多干扰,cpu.cfs_quota_us
会被重置为初始值。建议您结合自身应用的实际情况,合理设置整机安全水位阈值,避免因整机利用率过高而影响应用性能。
开启CPU Burst策略是否必须使用Alibaba Cloud Linux操作系统?
ack-koordinator的CPU Burst策略适用于所有Alibaba Cloud Linux及CentOS开源内核。推荐您使用Alibaba Cloud Linux操作系统。借助Alibaba Cloud Linux内核特性,ack-koordinator可以提供更加细粒度的CPU弹性管理机制。更多信息,请参见在cgroup v1接口开启CPU Burst功能。
应用使用了Batch资源后,内存资源用量为什么突然变得更高?
对于在Pod Limit中配置了kubernetes.io/batch-memory
的应用(简称batch limit),ack-koordinator会等待容器创建后根据batch limit在节点上为其设置Cgroup限制参数。由于部分应用在启动时会根据容器Cgroup参数自动申请内存,若应用在Cgroup的memory.limit参数设置前就完成了启动,其内存的真实用量可能会超过batch limit。而操作系统不会立即缩减该进程的内存使用,从而导致容器的内存Cgroup参数无法设置成功,需等待至其真实用量降低至batch limit以下。
此时,建议您适当调整应用配置参数,控制其内存真实用量在batch limit以下,或在应用启动脚本中首先检查内存限制参数,确认完成设置后再进行启动,确保应用的内存用量存在合理限制,避免出现OOM等情况。
您可以在容器内执行以下命令,查看内存资源限制参数。
# 单位为字节。
cat /sys/fs/cgroup/memory/memory.limit_in_bytes
# 预期输出。
1048576000
CPU核数提高后,为什么性能反而下降并且Pod出现CPU Throttling限流问题?
问题现象
某业务部署于ACK集群中,原本分配8核CPU时,压测QPS为33,平均响应29ms。将Pod CPU资源增至12核后,压测QPS下降至9.6,平均响应提升至104ms,性能明显下降。监控发现12核Pod的CPU Throttling接近100%,而8核Pod Throttling仅0.15%。即使使用了ack-koordinator的CPU拓扑感知调度来进行绑核处理等优化后,12核Pod的性能依然不如8核,且CPU Throttling仍然存在。而业务直接部署在ECS上则表现正常。
问题原因
根本原因:Linux内核CFS(完全公平调度器)cgroup调度存在历史性bug。在低于4.19的内核(如CentOS 7的3.10内核)中,每个CPU核心每个调度周期内会预留1ms配额,周期内没消耗完则不会及时回收。Pod分配CPU核心越多,累计损耗的CPU配额就越大,导致整体可用CPU变少,甚至出现CPU Throttling限流,影响业务性能。
影响原理:高核数Pod每100ms调度周期会有(n-1)ms(n为分配CPU核数)无法被业务使用,导致CPU使用率提升但实际业务性能下降。
实际表现:即使Pod未打满CPU(低于limit),也可能出现CPU Throttling,导致延迟升高、性能下滑。监控中
container_cpu_cfs_throttled_periods_total
与container_cpu_cfs_periods_total
比值(即CPU CFS调度下的被限流时间与总时间的比值)异常增高。
解决方案
方法一(推荐):升级操作系统内核
建议升级至4.19及以上内核版本的操作系统,如Alibaba Cloud Linux 3 容器优化版、Alibaba Cloud Linux 3、ContainerOS等,该问题已被修复。
参考社区修复补丁:Linux内核修复PR。
方法二:容器CPU Burst特性优化
使用ack-koordinator的CPU Burst功能,让容器在空闲时预留CPU可供突发时用,缓解CPU Throttling对性能的影响。
该方式为优化措施,根本解决还是推荐升级内核。
方法三:容器CPU调度策略优化
使用ack-koordinator的CPU拓扑感知调度功能进行绑核处理,提升调度稳定性,缓解由CPU Throttling导致的问题。
降低Pod分配的CPU核数,减少每周期损耗的配额。
该方式为优化措施,根本解决还是推荐升级内核。
当前已通过ack-slo-manager的旧版本协议使用了动态资源超卖功能,升级为ack-koordinator组件后是否继续支持?
旧版本的动态资源超卖协议包括两部分:
在Pod的Annotation中填写的
alibabacloud.com/qosClass
。在Pod的Request和Limit中填写的
alibabacloud.com/reclaimed
。
ack-koordinator兼容以上旧版本协议,并在ACK托管集群Pro版的调度器中统一计算新旧版本协议的资源申请量和可用量。您可将组件无缝升级至ack-koordinator。
ack-koordinator对旧版本协议的兼容期限截止至2023年07月30日。强烈建议您将原协议资源字段及时升级到新版本。
ACK托管集群Pro版的调度器和ack-koordinator对各版本协议的适配如下。
调度器版本 | ack-koordinator版本(ack-slo-manager) | alibabacloud.com协议 | koordinator.sh协议 |
≥1.18且<1.22.15-ack-2.0 | ≥0.3.0 | 支持 | 不支持 |
≥1.22.15-ack-2.0 | ≥0.8.0 | 支持 | 支持 |
当前已通过ack-slo-manager的旧版本协议使用了CPU Burst功能,升级为ack-koordinator后是否继续支持?
旧版本的Pod协议要求在Annotation中填写alibabacloud.com/cpuBurst
,ack-koordinator对此旧版本协议完全兼容,您可将组件无缝升级至新版本。
ack-koordinator对旧版本协议的兼容期限截止至2023年07月30日。强烈建议您将原协议资源字段及时升级到新版本。
ack-koordinator对各版本协议的适配如下。
ack-koordinator版本 | alibabacloud.com协议 | koordinator.sh协议 |
≥0.2.0 | 支持 | 不支持 |
≥0.8.0 | 支持 | 支持 |
当前已经通过ack-slo-manager的旧版本协议使用了CPU QoS功能,升级为ack-koordinator后是否继续支持CPU QoS功能?
旧版本(≤0.8.0)的Pod协议中,通过在Pod的Annotation中填写alibabacloud.com/qosClass
启用CPU QoS。
ack-koordinator保持了对以上旧版本协议的兼容,您可以将组件无缝升级至ack-koordinator,并逐步将Pod切换为koordinator.sh协议。ack-koordinator将对以上旧版本协议兼容至2023年07月30日,我们建议您将原协议资源字段及时升级到新版本。
ack-koordinator各版本对CPU QoS功能的适配如下。
组件版本 | alibabacloud.com协议 | koordinator.sh协议 |
≥0.5.2且<0.8.0 | 支持 | 不支持 |
≥0.8.0 | 支持 | 支持 |
当前已经通过ack-slo-manager的旧版本协议使用了容器内存QoS功能,升级为ack-koordinator后是否继续支持容器内存QoS功能?
旧版本(≤0.8.0)的Pod协议包括:
在Pod的Annotation中填写
alibabacloud.com/qosClass
。在Pod的Annotation中填写
alibabacloud.com/memoryQOS
。
ack-koordinator兼容以上旧版本协议,您可以将组件无缝升级至ack-koordinator。兼容支持至2023年7月30日。建议您将原协议资源字段及时升级到新版本。
ack-koordinator各版本对内存QoS功能的适配如下。
组件版本 | alibabacloud.com协议 | koordinator.sh协议 |
≥0.3.0且<0.8.0 | 支持 | 不支持 |
≥0.8.0 | 支持 | 支持 |
重调度FAQ
节点利用率阈值已经达到阈值,但是节点上Pod没有被驱逐怎么办?
出现这种情况时,一般可能是有以下几种原因,请参考对应的解决方法进行调整。
原因分类 | 原因描述 | 解决方法 |
组件配置未生效 | 开启范围未指定 | 重调度器配置中包含Pod和节点的开启范围配置,请检查对应的命名空间和节点是否开启。 |
重调度器配置修改后未重启 | 重调度器配置修改后,需要对其进行重启才能生效。关于重启重调度器,请参见步骤二:开启负载热点打散重调度插件。 | |
节点状态不满足条件 | 节点的平均利用率长时间低于阈值 | 重调度器会持续对利用率监控一段时间,并对监控数据做平滑均值处理,因此只有节点持续超过阈值才会触发重调度,默认为10分钟左右。而 |
集群内剩余的容量不足 | 在对Pod驱逐前,重调度器会对集群内其他节点进行检查,确保容量充足才会进行迁移。例如选择了一个规格为8 Core 16 G的Pod准备驱逐,而集群所有节点的空闲容量均低于该值,出于安全考虑重调度器则不会对其迁移。请考虑增加节点,确保集群容量充足。 | |
工作负载属性约束限制 | 工作负载为单副本 | 为了保证单副本应用的高可用,这类Pod默认不参与重调度。如果您评估此类单副本应用后,希望该Pod参与重调度,请在Pod或者工作负载(如Deployment或StatefulSet)的TemplateSpec中追加Annotation 说明 v1.3.0-ack1.6、v1.3.0-ack1.7、v1.3.0-ack1.8版本不支持该Annotation配置。建议参见安装和管理组件升级组件至最新版本。 |
Pod指定了HostPath或EmptyDir | 出于安全考虑,这类指定了HostPath或EmptyDir的Pod默认不参与重调度。如果需要对其进行迁移,可以参考evictLocalStoragePods配置允许其参与重调度。详细信息,请参见驱逐迁移控制配置。 | |
不可用或迁移中的副本数量过多 | 当工作负载(如Deployment或StatefulSet)的不可用或迁移中的副本数超过了限制配置(maxUnavailablePerWorkload或maxMigratingPerWorkload)时,例如,maxUnavailablePerWorkload和maxMigratingPerWorkload设置为20%,Deployment的期望副本数设置为10,当前正好有2个Pod正在被驱逐或者正在发布,重调度器就不会对其发起驱逐。请等待Pod驱逐或发布完成,或将以上两个配置调大。 | |
副本数量约束配置错误 | 当工作负载的副本总数小于等于最大迁移数量配置maxMigratingPerWorkload或最大不可用数量配置maxUnavailablePerWorkload时,出于安全考虑重调度器将不会对其进行重调度。请将以上两个配置调小或修改为百分比模式。 |
重调度器频繁重启是什么原因?
重调度器的配置ConfigMap格式错误或不存在,请参见高级配置参数检查ConfigMap文件内容和格式并进行修改,修改后重启重调度器。重启重调度器,请参见步骤二:开启负载热点打散重调度插件。
负载感知调度和热点打散重调度如何搭配使用?
开启热点打散重调度后,负载热点上的Pod将会被驱逐。对于上层控制器(例如Deployment)新建的Pod,调度器会根据其配置选择合适的节点进行调度。为了获得更好的负载均衡效果,建议您同时为调度器开启负载感知调度能力,请参见使用负载感知调度。
配置时,建议您将负载感知调度中的节点筛选功能参数loadAwareThreshold配置为与热点打散重调度器的highThresholds参数相同的值,具体请参见策略说明。当节点的负载超过highThresholds时,重调度器将驱逐该节点上的Pod,而调度器则通过loadAwareThreshold拒绝新的Pod被调度到该热点节点上。否则,经驱逐的Pod可能重新被调度到原来的节点,尤其是在Pod指定了节点调度范围,但对应的节点数量较少且利用率较为接近时。
重调度参考的利用率算法是什么?
重调度器会持续对利用率监控一段时间,并对监控数据做平滑均值处理,因此只有节点持续超过阈值才会触发重调度,默认为10分钟左右。此外对于内存资源维度,重调度器参考的内存用量排除了page cache,因为这部分资源是可以被操作系统回收的,而通过kubectl top node
返回的利用率是包含page cache的,您可以通过使用阿里云Prometheus监控查看真实的内存用量信息。
其他
在使用wrk压测中,测试结果提示“Socket errors: connect 54,”怎么办?
问题描述
在使用wrk压测中,测试结果提示Socket errors: connect 54,
。测试中的wrk Client和Nginx Server建立连接失败,测试结果失效。
问题原因
该错误通常是因为客户端的连接数受限,导致客户端建立连接失败。
解决办法
为了避免该错误,请在压测机上检查系统的TCP连接配置,并尝试启用TCP连接重用。
登录压测机,执行如下命令,查看是否开通TCP连接重用。
sudo sysctl -n net.ipv4.tcp_tw_reuse
命令输出为
0
或2
,说明系统未完全开启TCP连接重用。执行如下命令,启用TCP连接重用。
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
使用wrk工具再次发起压测请求。
检查测试结果不再包含
Socket errors: connect 54, ...
的报错提示,说明测试结果有效。
操作步骤中使用的指令仅在压测机上执行,测试机无需配置。测试完成后,请通过sysctl -w net.ipv4.tcp_tw_reuse
恢复原始配置,避免不必要的影响。
为什么k8s-reclaimed-resource页签中,集群混部收益情况区域没有数据?
查看是否已安装ack-koordinator组件。
查看在离线混部监控大盘是否显示相关数据。
若不显示,请执行以下步骤:
登录ARMS控制台。
在左侧导航栏选择 ,进入可观测监控 Prometheus 版的实例列表页面。
在页面左上角选择目标地域,单击Prometheus实例名称,然后在左侧导航栏单击指标管理。
单击蓝色指标(Metrics)按钮,按照页面提示搜索并选择kube_node_labels,查看指标的数据详情。
是否可以使用Arm架构类型的竞价(Spot)实例?
目前已经提供Arm架构的竞价实例。关于使用方式,请参见使用抢占式实例。
在ACK集群中使用Arm架构节点有哪些限制?
目前,对于Arm架构,组件中心仅支持以下组件:
核心组件
日志和监控
存储
网络
应用市场的组件不支持Arm。