有時為查效能瓶頸,會用Perl解析Log,看哪條Thread執行時間過久。會偷懶藉助ChatGPT協助幫忙寫一支分析程式,如下面的時間差,主要是不想再安裝其它模組,特別在客戶端。
以下程式讀WebSphere的SystemOut.log,印出每個Thread起迄時間及執行多久。它的Thread ID用方括號括起,以%tm雜湊變數,Key為Thread ID,Value是Array,放起始時間及截止時間,再呼叫計算時間差的迴圈。
#!/usr/bin/perl
open my $handle, '<', "./SystemOut.log";
chomp(my @lines = <$handle>);
close $handle;
my %tm = {};
for my $line (@lines) {
if ($line =~ /^\[/) {
my $idx = index($line, ']');
my $tid = substr($line, $idx + 2, 8);
if (exists $tm{$tid}) {
my $first = $tm{$tid}[0];
$tm{$tid} = [$first, $line];
# print "$tid : $tm{$tid}[1]\n";
} else {
$tm{$tid} = [$line, ''];
}
}
}
foreach my $tid (keys %tm) {
my $tmStart = substr($tm{$tid}[0], 9, 12);
my $tmEnd = substr($tm{$tid}[1], 9, 12);
# print "$tmStart , $tmEnd \n";
my ($hours1, $minutes1, $seconds1, $milliseconds1) = split /[:]/, $tmStart;
my ($hours2, $minutes2, $seconds2, $milliseconds2) = split /[:]/, $tmEnd;
# 將時間轉為總毫秒數
my $total_milliseconds1 = ($hours1 * 3600 + $minutes1 * 60 + $seconds1) * 1000 + $milliseconds1;
my $total_milliseconds2 = ($hours2 * 3600 + $minutes2 * 60 + $seconds2) * 1000 + $milliseconds2;
# 計算時間差
my $diff_milliseconds = $total_milliseconds2 - $total_milliseconds1;
$diff_milliseconds = 0 if ($diff_milliseconds < 0);
#print "$tid\t$diff_milliseconds:\n$tm{$tid}[0]\n$tm{$tid}[1]\n";
print "$diff_milliseconds\t$tid\n";
}
得到如下:
第一行第一個欄位是Thread ID,第二欄位是執行毫秒。
第二、第三行則是印出該Thread的起迄時間行Log原值。
000021df 8056279:
[4/16/24 17:11:17:552 CST] 000021df SystemOut O ==============
[4/16/24 19:25:33:831 CST] 000021df SystemOut O ============== 2024-04-16 19:25:33.558