科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道用机器生成的音乐来监控Linux计算机 (2)

用机器生成的音乐来监控Linux计算机 (2)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在最初通知事件后,vmstat 中的 bi(磁盘块入)和 bo(磁盘块出)数据字段将被聚结为范围在 0 到 1,000 的一个字段。

作者:Nathan Harrington 来源:chinaunix 2007年10月14日

关键字: 操作系统 Linux 监控 机器

  • 评论
  • 分享微博
  • 分享邮件
 

在最初通知事件后,vmstat 中的 bi(磁盘块入)和 bo(磁盘块出)数据字段将被聚结为范围在 0 到 1,000 的一个字段。请注意,这些值十分适于测试计算机的标准 IDE 磁盘设置。如果在整个磁盘子系统中有一个高磁盘配置或低磁盘配置,则可能需要修改最大值,以便更准确地表示可用带宽。一旦总磁盘使用量的范围落在 0 到 1,000 的范围内,就会被除以 10 以获得 0 到 100 之间的值。然后将在通道 8 中使用通常的最小值和最大值把此值作为通知速率发送。

getNetworkStats 部分略微更复杂,但正如您所见,返回的数据库值范围在 0 到 100 之间,并作为另一个 noteon 事件发送出去。注意此最后一个通知事件的最大值是 84。这是由于 SoundFont 仅在通道 5 中创建音频通知,音频速率范围从 0 到 84。这可以证明足以检测在最大负荷状态下和声中的变化的那些音频通知是表示有问题的。

在圈选循环括号和计时代码后,它就成为了子例程。

清单 5. sendNote 子例程

sub sendNote {

my( $noteVal, $noteChan, $min, $max ) = @_;

if( $noteVal < $min ){

$noteVal = $min;

}else{

# divide it into twelve parts

$noteVal = sprintf( "%0.0f", $noteVal/12);

# reduce the note to 12 at the very least;

$noteVal = ($noteVal * 12);

if( $noteVal > $max ) { $noteVal = $max }

}#if note is > minimum

print "noteon $noteChan $noteVal 100\n";

}#sendNote

sendNote 子例程将获得值在 0 到 100 之间的通知速率,并将把该通知速率转换为基本通知中最接近 12 的通知步骤。在这种情况下,基本通知是 12,并且所有通知都将使用该值作为其 0 状态。这就为系统处于低负载状态时提供了频率相当低的 “跳动”(如果为令人满意的固定状态赋予人性的话)。为简单起见,所有通知都是以音量级别 100 输出的。根据其他系统元素修改音量级别会是添加信息的直观方法,而无需添加通知或和声变化。

清单 6. getNetworkStats 子例程

sub getNetworkStats {

my $networkCmd = "/sbin/ifconfig eth0 | grep 'RX bytes'";

$networkCmd = `$networkCmd`;

my $rxBytes = 0;

my $txBytes = 0;

chomp($networkCmd);

for( $networkCmd ){

$rxBytes = substr($_, 19);

$rxBytes = substr($rxBytes,0,index($rxBytes," "));

$txBytes = substr($_, 52);

$txBytes = substr($txBytes,0,index($txBytes," "));

my $bothBytes = $rxBytes + $txBytes;

if( $totalPackets == 0 ){

$totalPackets = $bothBytes;

}else{

# find the difference between measurements, set maximum difference to

# 1Mbit, which works well for `saturated' on a 100Mbit/sec network

# reduce the value by a factor of 10000, which spreads the usage

# nicely over 1-100

my $diffRX = $bothBytes - $totalPackets;

if( $diffRX > 1000000 ){ $diffRX = 1000000 }

$diffRX = ($diffRX / 10000);

$totalPackets = $bothBytes;

return( $diffRX );

}# if not first packet check

}# packet count check

}#getNetworkStats

如果 obtuse 方法接近网卡的负载,则这段代码是简单的。/sbin/ifconfig/eth0 命令的输出将列出收到和传输的所有信息包总数。在网络连接速度为 100Mbit/sec 的测试计算机上,超过 1000,000 个传输或接收信息包的所有情况都被视为完全饱和。该值的范围随后会被调整为 0 到 100 之间的通知速率,并作为电子钢琴通知播放。

运行 chordStats

chordStats 程序将读取标准的 vmstat 程序,并在不缓冲的情况下把通知事件写入 FluidSynth 的 stdin。用命令 perl chordStats.pl |fluidsynth Hammered_Instruments.sf2 -c10000 -z10000 >/dev/null 启动 chordStats 程序。请记住,-c 和 -z 参数适用于扩大声音缓冲选项,而且可能需要进一步调整才能用于特殊的系统。

现在 chordStats 程序已经运行,尝试启动 Mozilla。首先要注意的是用管钟和钢片琴表示的 CPU 使用量的增加和磁盘 I/O 活动。如果用 wget 在 Mozilla 中装入一个较大的页面或下载文件,您将听到电子钢琴在网络链接饱和时发出更加刺耳的音调。

修改 chordStats

除了基本的系统负载之外,可以轻松地修改 chordStats 来表示计算环境的各个方面。回想 vmstat 1 将在每秒钟生成一张值列表。这可用于提供通知值,以及创建基本的节拍命令。修改 chordStats 的一种简单方法是将 vmstat 命令替换为刷新速度更快的事件生成器。例如,代码发行版归档附带的 fastUpdate.pl 程序将每五分之一秒扫描一次可用内存、当前进程和以太网中断。要使用最新更新的版本,请修改 chordStats.pl 程序以包含以下更改。

把命令从:

my $vmStatCmd = "vmstat 1";

更改为:

my $vmStatCmd = "./fastUpdate.pl 0.2 "

并把标题描述区域从:

for( split " ", "r b swpd free buff cache si so bi bo in cs us sy id wa" ){

更改为:

for( split " ", "memFree ethInt proc" ){

在主程序循环中,代码无需忽略标题行和输入的前两行。您可以根据需要移除这些条件。fastUpdate.pl 脚本的输出已被调整为范围在 0 到 100 之间,因此把 sendNote 事件从:

# user cpu usage

$note = $currLine[ $fields{us} ];

sendNote( $note, 14, 12, 96 );

# conglomerate disk i/o fields to one stat

$note = $currLine[ $fields{bi} ] + $currLine[ $fields{bo} ];

if( $note > 1000 ){ $note = 1000; }

$note = $note/10;

sendNote( $note, 8, 12, 96 );

# network throughput on eth0

$note = getNetworkStats();

sendNote( $note, 5, 12, 84 );

更改为:

$note = $currLine[ $fields{memFree} ];

sendNote( $note, 14, 48, 96 );

$note = $currLine[ $fields{ethInt} ];

sendNote( $note, 8, 48, 96 );

$note = $currLine[ $fields{proc} ];

sendNote( $note, 5, 48, 96 );

请注意,此修正版中将最小值增加到了 48。这是对选定的 SoundFont (Electronic_Sounds.sf2) 的特性的补偿。用命令 perl chordStats.pl |fluidsynth Electronic_Sounds.sf2 -c10000 -z10000 >/dev/null 来运行此更新版本的 chordStats,并且您将听到扬声器发射出的优美的 1960s sci-fi/B-movie 声道。

结束语

通过本示例,可以修改 chordStats 来根据所选的任何参数来播放音乐。修改 fastUpdate 以读取 strace 或 gprof 输出,比较构建过程日志文件并监视错误,或将多台计算机和网络设备的性能统计信息组合为通知流。

如果还有兴趣,请尝试根据附加数据修改音量参数。例如,如果信息包的数目保持不变,但中断次数不断增加,则需要增加网络通知的音量以强调对这方面的注意力。尝试移入三度音阶而不是整个八度音阶,或在检测到值发生较大变化时插入一个休止符以强调随后的阶段。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章