系统服务与优化:让Jetson跑得更稳、更快、更省电
说实话,很多刚接触Jetson的朋友,拿到板子第一件事就是跑模型、调算法。但我个人的习惯是——先做系统瘦身和优化。你想想看,一个满载无用服务的系统,就像背着沙袋跑步,怎么可能发挥出Jetson的真正实力?
这一章,我就带你从四个维度入手:禁用无用服务、CPU频率调节、GPU模式切换、内存交换空间配置。这些都是我在多个Jetson项目里反复验证过的优化手段。
核心思路:嵌入式系统优化的本质,是“减少不必要的开销,让硬件资源集中在真正需要的地方”。
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-daemon 和 nvidia-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。如果是电池供电的移动设备,用 conservative 或 schedutil。
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上常用的交换方案有两种:zRAM 和 swapfile。
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卡!
好了,这一章的内容就到这里。系统优化是个持续的过程,没有银弹。你需要根据实际项目需求,在性能、功耗、稳定性之间找到平衡点。记住,优化的目的是让系统更高效地完成你的任务,而不是为了优化而优化。