@@ -3,11 +3,12 @@ module TerminalSystemMonitor
3
3
using Dates: Dates, Day, DateTime, Second
4
4
using UnicodePlots
5
5
import Term # this is required by UnicodePlots.panel
6
- using MLDataDevices: MLDataDevices, CUDADevice
6
+ using MLDataDevices: MLDataDevices, CUDADevice, CPUDevice, MetalDevice
7
7
8
8
export monitor # entrypoint from REPL
9
9
10
10
# These function will be defined in Package extensions
11
+ function plot_cpu_utilization_rates end
11
12
function plot_gpu_utilization_rates end
12
13
function plot_gpu_memory_utilization end
13
14
@@ -77,7 +78,7 @@ function extract_number_and_unit(str::AbstractString)
77
78
end
78
79
end
79
80
80
- function plot_cpu_utilization_rates ()
81
+ function plot_cpu_utilization_rates (:: Type{CPUDevice} )
81
82
ys = get_cpu_percent ()
82
83
npad = 1 + floor (Int, log10 (length (ys)))
83
84
xs = [" id: $(lpad (i- 1 , npad)) " for (i, _) in enumerate (ys)]
@@ -94,7 +95,7 @@ function plot_cpu_utilization_rates()
94
95
return plts
95
96
end
96
97
97
- function plot_cpu_memory_utilization ()
98
+ function plot_cpu_memory_utilization (:: Type{CPUDevice} )
98
99
memorytotal, memorytotal_unit =
99
100
Sys. total_memory () |> Base. format_bytes |> extract_number_and_unit
100
101
memoryfree, _ = Sys. free_memory () |> Base. format_bytes |> extract_number_and_unit
@@ -141,27 +142,42 @@ function main(dummyargs...)
141
142
while true
142
143
try
143
144
plts = []
144
- append! (plts, plot_cpu_utilization_rates ())
145
+ append! (plts, plot_cpu_utilization_rates (CPUDevice ))
145
146
_, cols = displaysize (stdout )
146
147
n = max (1 , cols ÷ 25 )
147
148
chunks = collect (Iterators. partition (plts, n))
148
149
f = foldl (/ , map (c -> prod (UnicodePlots. panel .(c)), chunks))
149
150
150
- f /= prod (UnicodePlots. panel .(plot_cpu_memory_utilization ()))
151
+ f /= prod (UnicodePlots. panel .(plot_cpu_memory_utilization (CPUDevice )))
151
152
152
153
if isdefined (Main, :CUDA ) &&
153
154
getproperty (getproperty (Main, :CUDA ), :functional )()
154
155
cudaplts = []
155
156
n = max (1 , cols ÷ 50 )
156
- plts1 = plot_gpu_utilization_rates (MLDataDevices . CUDADevice):: Vector{Any}
157
- plts2 = plot_gpu_memory_utilization (MLDataDevices . CUDADevice):: Vector{Any}
157
+ plts1 = plot_gpu_utilization_rates (CUDADevice):: Vector{Any}
158
+ plts2 = plot_gpu_memory_utilization (CUDADevice):: Vector{Any}
158
159
for i in eachindex (plts1, plts2)
159
160
push! (cudaplts, plts1[i])
160
161
push! (cudaplts, plts2[i])
161
162
end
162
163
gpuchunks = collect (Iterators. partition (cudaplts, n))
163
164
f /= foldl (/ , map (c -> prod (UnicodePlots. panel .(c)), gpuchunks))
164
165
end
166
+
167
+ if isdefined (Main, :Metal )
168
+ metalplts = []
169
+ n = max (1 , cols ÷ 50 )
170
+ plts1 = plot_cpu_utilization_rates (MetalDevice):: Vector{Any}
171
+ plts2 = plot_gpu_utilization_rates (MetalDevice):: Vector{Any}
172
+ for i in eachindex (plts1)
173
+ push! (metalplts, plts1[i])
174
+ end
175
+ for i in eachindex (plts2)
176
+ push! (metalplts, plts2[i])
177
+ end
178
+ metalchunks = collect (Iterators. partition (metalplts, n))
179
+ f /= foldl (/ , map (c -> prod (UnicodePlots. panel .(c)), metalchunks))
180
+ end
165
181
clearlinesall ()
166
182
display (f)
167
183
catch e
0 commit comments