Docker上にWineを構築しWindowsのアプリケーションを動作させているのですが、WindowsアプリケーションがCPUのリソースを無尽蔵に使いそうな勢いなので、cpulimitを利用して制御しました。
今回の対象ソフトは「BaseStation.exe」になります。(所有者はlxd)
topでのリソース利用状況表示。
top - 17:21:46 up 6:45, 3 users, load average: 1.69, 2.65, 1.69
Tasks: 244 total, 1 running, 240 sleeping, 1 stopped, 2 zombie
%Cpu(s): 13.0 us, 8.2 sy, 0.0 ni, 77.6 id, 0.0 wa, 0.0 hi, 1.2 si, 0.0 st
MiB Mem : 3837.0 total, 1221.4 free, 1328.5 used, 1287.0 buff/cache
MiB Swap: 3838.0 total, 3833.2 free, 4.8 used. 2222.0 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8302 lxd 20 0 2711864 93684 15812 T 98.6 2.4 62:28.44 BaseStation.+
cpulimitでの制御
# Usage of cpclimit
cpulimit -p PID -l CPU利用率(1-200)
# BaseStation.exeのCPU利用率を15%に制御
cpulimit -p 8302 -l 15
# cpulimit適用後のtop
top - 17:26:03 up 6:49, 3 users, load average: 0.60, 0.68, 0.71
Tasks: 247 total, 3 running, 242 sleeping, 0 stopped, 2 zombie
%Cpu(s): 19.0 us, 8.2 sy, 0.0 ni, 71.4 id, 0.0 wa, 0.0 hi, 1.4 si, 0.0 st
MiB Mem : 3837.0 total, 1115.2 free, 1406.8 used, 1315.0 buff/cache
MiB Swap: 3838.0 total, 3833.2 free, 4.8 used. 2143.8 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8302 lxd 20 0 2711884 93692 15812 S 16.5 2.4 63:14.66 BaseStation.+
参考: BaseStation.exeのPIDを取得し、cpulimitを適用するshell script
#!/bin/bash
ps aux | grep BaseStation.exe | grep lxd
PID=`ps aux | grep BaseStation.exe | grep lxd | awk '{print $2}' `
echo ""
echo "PID for BaseStation.exe must be:"${PID}
echo ""
echo "sudo /usr/bin/cpulimit -p ${PID} -l 15 &"
echo ""
sudo /usr/bin/cpulimit -p ${PID} -l 15 &
echo "Press Enter to continue..."