ARM架构服务器在云计算和IDC数据中心中的应用持续扩大,AWS Graviton、阿里云倚天710、华为鲲鹏920等ARM处理器凭借高能效比在Web服务、微服务、数据库等场景中表现出色。本文以鲲鹏920服务器为例,完整梳理ARM服务器从系统安装、软件适配到性能调优的部署流程。
ARM服务器系统安装与环境准备
鲲鹏920搭载Kunpeng 920处理器,支持CentOS/openEuler/Ubuntu等主流Linux发行版的AArch64版本。以openEuler 22.03 LTS为例,安装过程与x86基本一致,但需注意固件选择。
# 检查CPU架构和核心数
uname -m # 输出: aarch64
lscpu | grep -E "Model name|CPU\(s\)|Architecture"
# Architecture: aarch64
# Model name: Kunpeng-920
# CPU(s): 128
# 查看NUMA拓扑
numactl --hardware
# available: 4 nodes (0-3)
# node 0 cpus: 0 1 2 ... 31
# node 1 cpus: 32 33 ... 63
# node 2 cpus: 64 65 ... 95
# node 3 cpus: 96 97 ... 127
NUMA拓扑对性能影响显著。鲲鹏920的4个NUMA节点对应4个超级核集群,跨节点内存访问延迟约增加2-3倍。部署应用前需要明确NUMA绑定策略。
软件生态适配与编译优化
ARM服务器的软件适配主要涉及两个层面:源码编译和依赖库替换。大多数现代软件已提供ARM原生支持,但编译参数需要针对性调整。
GCC编译优化参数
# 针对鲲鹏920的GCC编译参数
# -march=armv8.2-a: 启用ARMv8.2指令集
# -mtune=kunpeng920: 针对鲲鹏920微架构优化
# -ftree-vectorize: 启用自动向量化
CFLAGS="-O3 -march=armv8.2-a -mtune=kunpeng920 -ftree-vectorize -fopt-info-vec"
CXXFLAGS="$CFLAGS"
# 编译Nginx示例
./configure \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-cc-opt="-O3 -march=armv8.2-a -mtune=kunpeng920" \
--with-ld-opt="-L/usr/lib/aarch64-linux-gnu"
make -j128
make install
Java应用适配
鲲鹏平台推荐使用毕昇JDK(基于OpenJDK的华为增强版),内置ARM向量化优化和NUMA感知内存分配:
# 安装毕昇JDK
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-17.0.12-linux-aarch64.tar.gz
tar -xzf bisheng-jdk-17.0.12-linux-aarch64.tar.gz -C /usr/local/
ln -s /usr/local/bisheng-jdk-17.0.12 /usr/local/jdk
# 配置JVM参数,启用NUMA感知
export JAVA_HOME=/usr/local/jdk
JAVA_OPTS="-server \
-Xms16g -Xmx16g \
-XX:+UseG1GC \
-XX:+UseNUMA \
-XX:+UseTransparentHugePages \
-XX:MaxGCPauseMillis=200 \
-XX:ParallelGCThreads=32 \
-XX:ConcGCThreads=8"
NUMA绑定与中断优化
NUMA绑定是ARM服务器性能调优的关键环节。对于网络密集型应用,将网卡中断和应用线程绑定到同一NUMA节点,可以显著降低跨节点内存访问延迟。
# 查看网卡所属NUMA节点
cat /sys/class/net/eth0/device/numa_node
# 输出: 0 表示eth0在NUMA节点0上
# 设置网卡中断亲和性,将中断绑定到NUMA 0的CPU核心
# 获取eth0的中断号
grep eth0 /proc/interrupts | awk '{print $1}' | tr -d ':'
# 假设输出: 45 46 47 48 (多队列中断)
# 将中断45-48绑定到CPU 0-3(NUMA 0)
for i in $(seq 45 48); do
cpu=$((i - 45))
echo $((1 << cpu)) > /proc/irq/$i/smp_affinity
done
# 使用numactl绑定应用进程到指定NUMA节点
numactl --cpunodebind=0 --membind=0 /usr/local/nginx/sbin/nginx
# 对于多实例部署,每个实例绑定不同NUMA节点
numactl --cpunodebind=0 --membind=0 java -jar app1.jar --server.port=8080 &
numactl --cpunodebind=1 --membind=1 java -jar app1.jar --server.port=8081 &
numactl --cpunodebind=2 --membind=2 java -jar app1.jar --server.port=8082 &
numactl --cpunodebind=3 --membind=3 java -jar app1.jar --server.port=8083 &
磁盘IO性能调优
ARM服务器的存储IO优化与x86类似,但需要注意ARM平台的NVMe驱动性能差异。使用io_uring替代传统AIO可以显著提升IO吞吐:
# 查看当前IO调度器
cat /sys/block/nvme0n1/queue/scheduler
# none [mq-deadline] kyber bfq
# NVMe SSD推荐使用none调度器(不使用调度器)
echo none > /sys/block/nvme0n1/queue/scheduler
# 调整队列深度
echo 1024 > /sys/block/nvme0n1/queue/nr_requests
echo 256 > /sys/block/nvme0n1/queue/read_ahead_kb
# 禁用透明大页(数据库场景)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 文件系统挂载优化(ext4)
mount -o noatime,nodiratime,data=writeback,barrier=0 /dev/nvme0n1p1 /data
使用fio进行IO基准测试,对比不同配置下的性能表现:
# 随机读写测试
fio --name=rand_rw \
--filename=/data/testfile \
--rw=randrw \
--rwmixread=70 \
--bs=4k \
--size=10G \
--numjobs=16 \
--iodepth=64 \
--runtime=60 \
--time_based \
--group_reporting \
--ioengine=io_uring
# 顺序读写测试(大块IO)
fio --name=seq_write \
--filename=/data/testfile \
--rw=write \
--bs=1m \
--size=10G \
--numjobs=4 \
--iodepth=32 \
--runtime=60 \
--time_based \
--group_reporting
网络性能调优
鲲鹏920内置网络加速引擎,配合智能网卡可实现高吞吐网络处理。内核网络参数调优要点:
# /etc/sysctl.d/99-network-tuning.conf
# TCP缓冲区优化
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# 连接队列优化
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_max_syn_backlog = 65535
# 启用TCP Fast Open
net.ipv4.tcp_fastopen = 3
# BBRR拥塞控制(内核5.4+)
net.ipv4.tcp_congestion_control = bbr
net.core.default_qdisc = fq
# 应用配置
sysctl -p /etc/sysctl.d/99-network-tuning.conf
性能对比与监控
部署完成后,使用sysbench和wrk进行综合性能评估:
# CPU基准测试
sysbench cpu --cpu-max-prime=20000 --threads=128 run
# 内存带宽测试
sysbench memory --memory-block-size=1M --memory-total-size=100G --threads=128 run
# Web服务压测
wrk -t64 -c2000 -d60s --latency http://localhost:8080/api/test
# 使用perf分析热点函数
perf record -g -p $(pgrep -f java) -- sleep 30
perf report --sort overthead,symbol
鲲鹏920与同频x86服务器在整数运算性能上接近,浮点运算略有差距。对于Java Web服务、Nginx反向代理、Redis缓存等整数密集型场景,ARM服务器的能效比优势明显,单位算力功耗约为x86的60-70%。在选型决策时,建议针对实际业务负载进行A/B测试,而非仅依赖基准测试数据。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/arm-jia-gou-fu-wu-qi-bu-shu-shi-jian-cong-xi-tong-an-zhuang/