抢占式任务配置

抢占式任务配置


背景


以前做项目使用Raspberry PI CM3 + RT Preempt做实时控制,这部分需要对系统和任务进行特殊的配置。

系统补丁


需要先将原内核替换为抢占式内核,这个在树莓派官方github内就有相应的rt版本内核,找步骤替换即可。

CPU隔离


CPU隔离就是将树莓派的四个CPU的其中一个从Linux系统的调度名单中划去,以便为我们实时任务服务。

修改/boot/cmdline.txt

1
2
3
4
nano /boot/cmdline.txt

添加
isolcpus=3

验证:

1
2
3
4
apt install systbench
sysbench --test=cpu --cpu-max-prime=20000 --num-threads=4 run

top

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Tasks: 126 total,   2 running,  83 sleeping,   0 stopped,   0 zombie
%Cpu0 : 87.8 us, 12.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu1 :100.0 us, 0.0 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu2 : 85.4 us, 14.6 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
%Cpu3 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 896152 total, 711340 free, 31848 used, 152964 buff/cache
KiB Swap: 102396 total, 102396 free, 0 used. 804976 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
817 root 20 0 8628 1636 1364 S 260.5 0.2 3:16.75 sysbench
486 root -51 0 0 0 0 S 7.0 0.0 0:19.05 irq/170-mcp251x
823 root 20 0 8204 3384 2852 R 7.0 0.4 0:00.11 top
81 root 20 0 0 0 0 I 4.7 0.0 0:04.10 kworker/0:2
28 root -2 0 0 0 0 S 2.3 0.0 0:00.30 ktimersoftd/2
86 root 20 0 0 0 0 S 2.3 0.0 0:03.22 spi0
87 root -51 0 0 0 0 S 2.3 0.0 0:00.23 irq/169-enc28j6
456 root 20 0 0 0 0 I 2.3 0.0 0:00.76 kworker/2:3
781 root 20 0 11652 5816 5096 S 2.3 0.6 0:00.44 sshd

在4线程CPU benchmark测试下,CPU3未被调度。

用户隔离


为实时进程添加新用户,并禁用登录:

1
2
adduser rttask
passwd -l rttask

SYSTEMD配置


几个注意点:

  1. User=rttask 设置用户隔离
  2. Nice=-20 设置用户态最高优先级
  3. CPUAffinity=3 设置CPU亲和性
  4. 资源限制

文件位置:

1
/lib/systemd/system/rttask.service

内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[Unit]
Description=real time task
After=network.service redis.service

[Service]
Type=simple
User=rttask
WorkingDirectory=/root/debug/web
ExecStart=/root/debug/web/rttask
Restart=always
StartLimitInterval=0
Nice=-20
CPUAffinity=3
MemoryMax=100M
CPUQuota=200%


[Install]
WantedBy=default.target

启动、自启动命令:

1
2
3
4
systemctl daemon-reload

systemctl start rttask
systemctl enable rttask

其它命令:

1
2
3
systemctl stop rttask
systemctl disable rttask
systemctl restart rttask

Комментарии

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×