问题描述
目前机器上有16张NPU卡,客户需要一次性收集所有的NPU日志。bmc.kepler.Systems.Processor.NPU的DumpLog一次性收集一张NPU的日志
做法一:在lua脚本依次调用DumpLog方法收集日志,直到收集完所有卡日志;但发现收集一张NPU卡日志的时间超出了30分钟,16张卡就需要超出8个小时才收集完,不现实。
做法二:使用lua的skynet.fork创建16个任务调用DumpLog同时收集每张卡的日志,但这样导致CPU跑满,后台日志报CPU idle率过低,bmc其他操作卡死,做法不现实。
做法三:实现一个任务队列,创建16个收集任务,但最多只允许同时运行8个任务,如果有任务完成则从队列中取出一个收集任务继续执行,这样CPU不跑满,收集日志时间也不需要那么长。设计示例如下:
local MAX_PARALLEL = 8
local task_list = {}
local task_queue = {}
local running_count = 0
local LogTask = class()
function LogTask.ctor(self, id, path)
self.id = id
self.path = path
self.state = ‘New’
self.progress = 0
end
function LogTask.init(self)
end
function LogTask.run(self)
– 启动收集日志
while true do
– 统计并更新任务状态
skynet.sleep(100)
end
end
local function task_finish()
–lock:lock()
running_count = running_count - 1
if #task_queue > 0 and running_count < MAX_PARALLEL then
local next_task = table.remove(task_queue, 1)
skynet.fork(function(next_task)
next_task:run()
task_finish()
end, next_task)
running_count = running_count + 1
end
–lock:unlock()
end
function m.collect_npu_log()
local npu_list = mdb.get_sub_objects(bus,
‘/bmc/kepler/Systems/1/Processors/NPU’,
‘bmc.kepler.Systems.Processor’)
for path, obj in pairs(npu_list) do
local task_obj = LogTask.new(obj.Id, path)
table.insert(task_list, task_obj)
–lock:lock()
if running_count < MAX_PARALLEL then
running_count = running_count + 1
–lock:unlock()
skynet.fork(function(task obj)
task_obj:run()
task_finish()
end, task_obj)
else
table.insert(task_queue, task_obj)
log:notice(‘NPU[%s] DumpLog task add to queue’, tostring(task_obj.id))
–lock:unlock()
end
end
skynet.fork(function()
while true do
–统计总的进程
skynet.sleep(100)
end
end)
end
现在我需要一个锁或互斥量来保护任务队列task_queue和运行计数running_count;
我尝试了lua的coroutine,但那是串行执行,skynet.spinlock、skynet.mutex在openUBMC里面使用不了,请问有什么锁或互斥机制我可以使用的吗?
咨询当前OpenUBMC中加锁一般是怎么用的 - 交流互助区 - openUBMC 论坛 这个帖子提到的是一个文件锁,并不适合我当前的业务。
环境信息
基于openubmc 2512_lts
~ ~ $ ipmcget -d version
------------------- openUBMC INFO -------------------
IPMC CPU: Hi1711
IPMI Version: 2.0
Active openUBMC Version: 1.17.10
Active openUBMC Build: 01
Active openUBMC Built: 14:33:07 Mar 27 2026
Backup openUBMC Version: 1.17.10
Available openUBMC Version: 1.00.16
Available openUBMC Build: 01
Active Uboot Version: 21.3.10.1 (09:53:00 Dec 30 2025)
Backup Uboot Version: 21.3.10.1 (09:53:00 Dec 30 2025)
Active Secure Bootloader Version: 21.3.10.1 (09:51:37 Dec 30 2025)
Backup Secure Bootloader Version: 21.3.10.1 (09:51:37 Dec 30 2025)
Active Secure Firmware Version: 21.3.10.1 (09:51:38 Dec 30 2025)
Backup Secure Firmware Version: 21.3.10.1 (09:51:38 Dec 30 2025)
Active BMCSDK Version: 5.12.00.01
----------------- Product INFO -----------------
Product ID: 0x0000
Product Name: Atlas 800I A3
Product Unique ID: 0x000000010302BF02
Active BIOS Version: (U75)21.23
Backup BIOS Version: 21.23
重现步骤
无。
期望结果
提供一个锁或互斥量机制。
实际结果
没有锁或互斥量机制。
尝试过的解决方案
无。
分析结论
无。