系统服务与优化:让Jetson跑得更稳、更快、更省电

说实话,很多刚接触Jetson的朋友,拿到板子第一件事就是跑模型、调算法。但我个人的习惯是——先做系统瘦身和优化。你想想看,一个满载无用服务的系统,就像背着沙袋跑步,怎么可能发挥出Jetson的真正实力?

这一章,我就带你从四个维度入手:禁用无用服务、CPU频率调节、GPU模式切换、内存交换空间配置。这些都是我在多个Jetson项目里反复验证过的优化手段。

核心思路:嵌入式系统优化的本质,是“减少不必要的开销,让硬件资源集中在真正需要的地方”。

Jetson 系统服务与优化知识体系 系统优化核心 禁用无用服务 蓝牙、Avahi、CUPS等 CPU频率调节 性能/节能模式切换 GPU模式切换 MAXN / 15W / 10W 交换空间配置 zRAM / swapfile 目标:降低延迟 → 提升吞吐 → 延长续航

10.1 禁用无用服务:给系统减负

Jetson默认开启了很多服务,但很多我们根本用不上。比如蓝牙——你见过谁在Jetson上连蓝牙键盘的?还有Avahi(零配置网络服务),在固定IP的生产环境里完全是多余的。

我个人习惯,拿到新刷好的JetPack系统,第一件事就是跑一遍 systemctl list-units --type=service --state=running,看看哪些服务在跑。

我的经验:在Jetson Nano上,禁用蓝牙和Avahi后,空闲内存从1.2GB提升到了1.5GB,效果很明显。

下面是我常用的禁用命令:

# 禁用蓝牙服务
sudo systemctl disable bluetooth.service
sudo systemctl stop bluetooth.service

# 禁用Avahi(零配置网络)
sudo systemctl disable avahi-daemon.service
sudo systemctl stop avahi-daemon.service

# 禁用打印服务(CUPS)
sudo systemctl disable cups.service
sudo systemctl stop cups.service

# 禁用ModemManager(如果你不用4G/5G模块)
sudo systemctl disable ModemManager.service
sudo systemctl stop ModemManager.service

注意:不要禁用 nvargus-daemonnvidia-persistenced,它们是Jetson的摄像头和GPU持久化服务,禁用了会影响AI推理性能。

我曾经在一个客户现场,发现他们的Jetson Orin NX跑得特别慢。排查了半天,原来是ModemManager一直在尝试枚举不存在的4G模块,占用了大量CPU。禁用之后,推理帧率直接提升了15%。

10.2 CPU频率调节:按需分配算力

Jetson的CPU支持多种调频策略。默认是 ondemand,也就是按需调频。但说实话,做AI推理时,我更推荐直接用 performance 模式,避免频率切换带来的延迟抖动。

查看当前CPU频率和策略:

# 查看所有CPU核心的当前频率
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq

# 查看当前调频策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

切换到性能模式:

# 将所有核心设置为performance模式
for i in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance | sudo tee $i
done

Jetson支持的调频策略:

策略名称 适用场景 特点
performance AI推理、实时控制 始终最高频率,延迟最低
ondemand 日常桌面使用 按需调频,平衡功耗
conservative 电池供电场景 频率升降更平缓
powersave 最低功耗需求 始终最低频率
schedutil 调度器协同 内核调度器驱动调频

我的建议:如果做实时性要求高的项目(比如机器人控制),用 performance。如果是电池供电的移动设备,用 conservativeschedutil

10.3 GPU模式切换:榨干每一分算力

Jetson的GPU支持多种功耗模式。以Jetson Orin NX为例,有MAXN(最高性能)、15W、10W等模式。切换GPU模式,本质上是调整GPU核心频率和内存频率的配置。

查看当前GPU模式:

sudo nvpmodel -q

列出所有支持的GPU模式:

sudo nvpmodel -p

切换到MAXN模式(Jetson Orin NX为例):

sudo nvpmodel -m 0   # 0 通常对应 MAXN 模式

切换到15W模式:

sudo nvpmodel -m 1   # 1 通常对应 15W 模式

小技巧:切换模式后,记得用 sudo jetson_clocks 锁定最大频率,确保性能稳定。我习惯在脚本里这样写:

# 先切换模式,再锁定时钟
sudo nvpmodel -m 0
sudo jetson_clocks

不同GPU模式的性能对比(Jetson Orin NX 16GB):

模式 GPU频率 CPU频率 功耗 适用场景
MAXN 1.3 GHz 2.0 GHz ~25W 高性能推理、训练
15W 918 MHz 1.5 GHz ~15W 边缘部署、电池供电
10W 652 MHz 1.2 GHz ~10W 低功耗持续运行

我曾经在一个无人机项目里,因为没注意GPU模式,默认跑在15W模式,结果模型推理帧率只有30fps。后来切换到MAXN模式,帧率直接飙到55fps。嗯,从那以后我每次部署前都会检查 nvpmodel 的设置。

10.4 内存交换空间配置:给内存加点“虚拟”助力

Jetson的内存通常不大(Nano只有4GB,Orin NX 16GB算大的了)。当内存不够用时,系统会触发OOM(Out Of Memory) killer,直接杀掉进程。为了避免这种情况,我们需要配置交换空间。

Jetson上常用的交换方案有两种:zRAMswapfile

zRAM:压缩内存,减少交换

zRAM是在内存中划出一块区域,用压缩算法(通常是LZ4或LZO)来存储数据。说白了,就是用CPU换内存。对于Jetson这种内存紧张的平台,zRAM非常实用。

查看当前zRAM状态:

cat /proc/swaps
zramctl

配置zRAM(以1GB为例):

# 安装zRAM工具(如果未安装)
sudo apt install zram-tools

# 编辑配置文件
sudo nano /etc/default/zramswap

# 设置zRAM大小为1GB
ALGO=lz4
PERCENT=50
PRIORITY=100

注意:zRAM的大小不要超过物理内存的50%,否则压缩和解压的开销会反噬性能。

swapfile:传统交换文件

如果你有SD卡或SSD,可以用swapfile。虽然速度不如zRAM,但胜在容量大。

创建4GB swapfile:

# 创建交换文件
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

# 永久生效
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

调整swappiness(控制使用交换空间的倾向):

# 查看当前值
cat /proc/sys/vm/swappiness

# 设置为10(更倾向于使用物理内存)
sudo sysctl vm.swappiness=10

# 永久生效
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
方案 优点 缺点 推荐场景
zRAM 速度快、无IO延迟 占用CPU、容量有限 内存4GB以下的Jetson
swapfile 容量大、配置简单 IO延迟高、磨损存储 有SSD的Jetson
两者结合 兼顾速度和容量 配置稍复杂 生产环境推荐

避坑指南:我曾经在一个Jetson Nano项目里,把swapfile放在了SD卡上,结果频繁的读写导致SD卡三个月就报废了。如果你用swapfile,一定要放在SSD或eMMC上,别放SD卡!

好了,这一章的内容就到这里。系统优化是个持续的过程,没有银弹。你需要根据实际项目需求,在性能、功耗、稳定性之间找到平衡点。记住,优化的目的是让系统更高效地完成你的任务,而不是为了优化而优化。


公众号:蓝海资料掘金营,微信 deep3321