Voici un petit script qui permet de transformer les logs obtenus en passant les paramètres "-verbose:gc -Xloggc:/temp/jvm.log" à la jvm en java pour voir l'utilisation de la mémoire.
Les logs obtenus ressemblent à ça:
0.000: [GC 508K->138K(1984K), 0.0042681 secs] 0.074: [GC 650K->251K(1984K), 0.0030702 secs] 0.198: [GC 763K->305K(1984K), 0.0035574 secs] 0.272: [GC 817K->465K(1984K), 0.0033527 secs] 0.320: [GC 976K->523K(1984K), 0.0020841 secs] ... 0.557: [Full GC 1489K->1015K(2112K), 0.0256656 secs] ...
Cette version est plus compacte mais moins facile à lire (à mon avis) que la seconde, on split la ligne en utilisant plusieurs séparateurs: K ou [GC ou ( ou -> ...
def change_to_csv(csv_file, line)
puts(line)
# 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
# 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
array = line.split(/(:)|( \[GC )|( \[Full GC )|(->)|(\))|(K)|(\()/)
time = array[0]
puts("time: " + time)
before_gc = array[4]
puts("before_gc: " + before_gc)
after_gc = array[8]
puts("after_gc: " + after_gc)
csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end
File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
csv_file << ("time;before_gc;after_gc;\n")
IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) }
end
La seconde version où on split au fur et à mesure (par dicotomie en quelque sorte):
def change_to_csv(csv_file, line)
puts(line)
# 0.000: [GC 508K->138K(1984K), 0.0042681 secs]
# 0.563: [Full GC 1488K->1005K(2112K), 0.0253077 secs]
split_time = line.split(':')
time = split_time[0]
puts("time: " + time)
rest = split_time[1]
split_gc = rest.split('->')
before_gc = split_gc[0].split('GC ')[1].split('K')[0]
puts("before_gc: " + before_gc)
after_gc = split_gc[1].split('K')[0]
puts("after_gc: " + after_gc)
csv_file << (time + ";" + before_gc + ";" + after_gc + ";\n")
end
File.open("jvm.csv", File::CREAT|File::RDWR) do |csv_file|
csv_file << ("time;before_gc;after_gc;\n")
IO.foreach("jvm.log") { |line| change_to_csv(csv_file, line) }
end
Dans les deux cas on cherche un fichier jvm.log et on fait un fichier jvm.csv qui resemble à ça:
time;before_gc;after_gc; 0.000;508;138; 0.073;650;251; 0.200;763;305; 0.274;817;465; 0.322;976;523; 0.379;1035;537; 0.408;1049;722; 0.426;1234;802; 0.433;1298;837; ...Il y a plus qu'à le passer dans excel et hop de jolies courbes!
Rem: je l'ai écrit rapidement, on peut surement faire plus élégant, mais mon but était l'efficacité et pour ça ruby est génial ;)
Aucun commentaire:
Enregistrer un commentaire