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