iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
佛心分享-我的私藏工具箱

作業系統的專武系列 第 21

解析Log每行Thread ID執行起迄時間及花費時間數

  • 分享至 

  • xImage
  •  

有時為查效能瓶頸,會用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

上一篇
在CentOS安裝離線版的Docker
下一篇
系統強化Windows部份
系列文
作業系統的專武30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言