mirror of
https://github.com/unraid/webgui.git
synced 2026-03-12 22:09:53 -05:00
Disk read/write IO in background daemon [code optimizations]
This commit is contained in:
@@ -36,7 +36,7 @@ function toggle_diskio(init) {
|
||||
}
|
||||
function array_status() {
|
||||
var diskio = $.cookie('diskio')===undefined ? 0 : 1;
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'array',diskio:diskio},function(data) {
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'array'},function(data) {
|
||||
if (data) {$('#array_devices').html(data); display_diskio();}
|
||||
<?if ($update && $var['fsState']=='Started'):?>
|
||||
<?if ($tabbed):?>
|
||||
|
||||
@@ -15,8 +15,7 @@ Title="Boot Device"
|
||||
?>
|
||||
<script>
|
||||
function boot_status() {
|
||||
var diskio = $.cookie('diskio')===undefined ? 0 : 1;
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'flash'<?if ($tabbed):?>,diskio:diskio<?endif?>},function(data) {
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'flash'},function(data) {
|
||||
if (data) {$('#boot_device').html(data); display_diskio();}
|
||||
<?if ($update && $var['fsState']=='Started'):?>
|
||||
<?if ($tabbed):?>
|
||||
|
||||
@@ -16,8 +16,7 @@ Cond="($var['fsState']=='Stopped' || $var['cacheSbNumDisks'])"
|
||||
?>
|
||||
<script>
|
||||
function cache_status() {
|
||||
var diskio = $.cookie('diskio')===undefined ? 0 : 1;
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'cache'<?if ($tabbed):?>,diskio:diskio<?endif?>},function(data) {
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=$path?>',device:'cache'},function(data) {
|
||||
if (data) {$('#cache_device').html(data); display_diskio();}
|
||||
<?if ($update && $var['fsState']=='Started'):?>
|
||||
<?if ($tabbed):?>
|
||||
|
||||
@@ -19,8 +19,7 @@ $tabX = '#tab'.($var['fsState']=='Stopped'||is_dir('/mnt/cache') ? '4' : '3');
|
||||
?>
|
||||
<script>
|
||||
function open_status() {
|
||||
var diskio = $.cookie('diskio')===undefined ? 0 : 1;
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=addslashes(htmlspecialchars($path))?>',device:'open'<?if ($tabbed):?>,diskio:diskio<?endif?>},function(data) {
|
||||
$.post('/webGui/include/DeviceList.php',{path:'<?=addslashes(htmlspecialchars($path))?>',device:'open'},function(data) {
|
||||
if (data) {$('#open_devices').html(data); display_diskio();}
|
||||
<?if ($update && $var['fsState']=='Started'):?>
|
||||
<?if ($tabbed):?>
|
||||
|
||||
@@ -19,7 +19,7 @@ $var = parse_ini_file('state/var.ini');
|
||||
$devs = parse_ini_file('state/devs.ini',true);
|
||||
$disks = parse_ini_file('state/disks.ini',true);
|
||||
$diskio= parse_ini_file('state/diskload.ini');
|
||||
$sum = ['count'=>0, 'temp'=>0, 'fsSize'=>0, 'fsUsed'=>0, 'fsFree'=>0, 'numReads'=>0, 'numWrites'=>0, 'numErrors'=>0];
|
||||
$sum = ['count'=>0, 'temp'=>0, 'fsSize'=>0, 'fsUsed'=>0, 'fsFree'=>0, 'ioReads'=>0, 'ioWrites'=>0, 'numReads'=>0, 'numWrites'=>0, 'numErrors'=>0];
|
||||
extract(parse_plugin_cfg('dynamix',true));
|
||||
|
||||
require_once "$docroot/webGui/include/CustomMerge.php";
|
||||
@@ -112,21 +112,8 @@ function fs_info(&$disk) {
|
||||
echo "<td colspan='2'></td><td>{$disk['fsStatus']}</td><td></td>";
|
||||
echo "<td>".device_browse($disk)."</td>";
|
||||
}
|
||||
function pull($dev,$i) {
|
||||
global $diskio;
|
||||
return explode(' ',$diskio[$dev])[$i];
|
||||
}
|
||||
function my_diskio($dev,$i) {
|
||||
global $disks;
|
||||
if ($dev=='A' || $dev=='P') {
|
||||
$type = $dev=='A' ? '/Parity|Data/' : '/Cache/';
|
||||
|
||||
$sum = 0;
|
||||
foreach ($disks as $disk) if (preg_match($type,$disk['type'])) $sum += pull($disk['device'],$i);
|
||||
return my_scale($sum,$unit,1)." $unit/s";
|
||||
} else {
|
||||
return my_scale(pull($dev,$i),$unit,1)." $unit/s";
|
||||
}
|
||||
function my_diskio($data) {
|
||||
return my_scale($data,$unit,1)." $unit/s";
|
||||
}
|
||||
function array_offline(&$disk,$w) {
|
||||
$warning = $w ? '<span class="red-text"><em>ALL DATA ON THIS DISK WILL BE ERASED WHEN ARRAY IS STARTED</em></span>' : '';
|
||||
@@ -165,12 +152,14 @@ function array_offline(&$disk,$w) {
|
||||
echo "</tr>";
|
||||
}
|
||||
function array_online(&$disk) {
|
||||
global $sum;
|
||||
$dev = $disk['device'];
|
||||
global $sum, $diskio;
|
||||
$data = explode(' ',$diskio[$disk['device']]);
|
||||
if (is_numeric($disk['temp'])) {
|
||||
$sum['count']++;
|
||||
$sum['temp'] += $disk['temp'];
|
||||
}
|
||||
$sum['ioReads'] += $data[0];
|
||||
$sum['ioWrites'] += $data[1];
|
||||
$sum['numReads'] += $disk['numReads'];
|
||||
$sum['numWrites'] += $disk['numWrites'];
|
||||
$sum['numErrors'] += $disk['numErrors'];
|
||||
@@ -200,8 +189,8 @@ function array_online(&$disk) {
|
||||
echo "<td>".device_info($disk)."</td>";
|
||||
echo "<td>".device_desc($disk)."</td>";
|
||||
echo "<td>".my_temp($disk['temp'])."</td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($dev,0)."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($dev,1)."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
|
||||
echo "<td>".my_number($disk['numErrors'])."</td>";
|
||||
fs_info($disk);
|
||||
break;
|
||||
@@ -233,8 +222,8 @@ function show_totals($text) {
|
||||
echo "<td><img src='/webGui/images/sum.png' class='icon'>Total</td>";
|
||||
echo "<td>$text</td>";
|
||||
echo "<td>".($sum['count']>0 ? my_temp(round($sum['temp']/$sum['count'],1)) : '*')."</td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($text[0],0)."</span><span class='number'>".my_number($sum['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($text[0],1)."</span><span class='number'>".my_number($sum['numWrites'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($sum['ioReads'])."</span><span class='number'>".my_number($sum['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($sum['ioWrites'])."</span><span class='number'>".my_number($sum['numWrites'])."</span></td>";
|
||||
echo "<td>".my_number($sum['numErrors'])."</td>";
|
||||
echo "<td></td>";
|
||||
if (strstr($text,'Array') && ($var['startMode']=='Normal')) {
|
||||
@@ -302,14 +291,14 @@ case 'array':
|
||||
break;
|
||||
case 'flash':
|
||||
$disk = &$disks['flash'];
|
||||
$dev = $disk['device'];
|
||||
$data = explode(' ',$diskio[$disk['device']]);
|
||||
$disk['fsUsed'] = $disk['fsSize']-$disk['fsFree'];
|
||||
echo "<tr>";
|
||||
echo "<td>".device_info($disk)."</td>";
|
||||
echo "<td>".device_desc($disk)."</td>";
|
||||
echo "<td>*</td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($dev,0)."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($dev,1)."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($data[0])."</span><span class='number'>".my_number($disk['numReads'])."</span></td>";
|
||||
echo "<td><span class='diskio'>".my_diskio($data[1])."</span><span class='number'>".my_number($disk['numWrites'])."</span></td>";
|
||||
echo "<td>".my_number($disk['numErrors'])."</td>";
|
||||
fs_info($disk);
|
||||
echo "</tr>";
|
||||
|
||||
@@ -1,21 +1,9 @@
|
||||
#!/bin/bash
|
||||
|
||||
# set offset values
|
||||
awk '/(sd[a-z]*|nvme[0-9]n1) /{print $4,$8}' /proc/diskstats >/var/tmp/reset
|
||||
|
||||
# reset counters and exit
|
||||
if [[ $1 == reset ]]; then
|
||||
echo -n >/var/local/emhttp/diskload.ini
|
||||
for dev in $(awk '/(sd[a-z]*|nvme[0-9]n1) /{print $3}' /proc/diskstats); do
|
||||
echo $dev=0 0 0 0 >>/var/local/emhttp/diskload.ini
|
||||
done
|
||||
exit
|
||||
fi
|
||||
|
||||
ini=/var/local/emhttp/diskload.ini
|
||||
declare -a sector reads writes
|
||||
|
||||
# t = poll interval in seconds
|
||||
t=6
|
||||
|
||||
# get sector size of each disk
|
||||
c=0
|
||||
for dev in $(awk '/(sd[a-z]*|nvme[0-9]n1) /{print $3}' /proc/diskstats); do
|
||||
@@ -26,14 +14,13 @@ done
|
||||
|
||||
# start daemon
|
||||
while :; do
|
||||
stats=($(awk '/(sd[a-z]*|nvme[0-9]n1) /{print $3,$6,$10,$4,$8}' /proc/diskstats))
|
||||
reset=($(cat /var/tmp/reset))
|
||||
stats=($(awk '/(sd[a-z]*|nvme[0-9]n1) /{print $3,$6,$10}' /proc/diskstats))
|
||||
c=0; s=${#stats[@]}
|
||||
echo -n >/var/local/emhttp/diskload.ini
|
||||
for ((i=0;i<s;i+=5)); do
|
||||
echo -n >$ini
|
||||
for ((i=0;i<s;i+=3)); do
|
||||
reads[c]=$((stats[i+1]-reads[c]))
|
||||
writes[c]=$((stats[i+2]-writes[c]))
|
||||
echo ${stats[i]}=$((reads[c]*sector[c]/t)) $((writes[c]*sector[c]/t)) $((stats[i+3]-reset[c*2])) $((stats[i+4]-reset[c*2+1])) >>/var/local/emhttp/diskload.ini
|
||||
echo ${stats[i]}=$((reads[c]*sector[c]/t)) $((writes[c]*sector[c]/t)) >>$ini
|
||||
reads[c]=${stats[i+1]}
|
||||
writes[c]=${stats[i+2]}
|
||||
((c++))
|
||||
|
||||
Reference in New Issue
Block a user