Uber JVM Profiler menyediakan Agen Java untuk mengumpulkan berbagai metrik dan pelacakan tumpukan untuk proses Hadoop/Spark JVM secara terdistribusi, misalnya metrik CPU/Memori/IO.
Uber JVM Profiler juga menyediakan kemampuan pembuatan profil tingkat lanjut untuk melacak metode dan argumen Java sewenang-wenang pada kode pengguna tanpa persyaratan perubahan kode pengguna. Fitur ini dapat digunakan untuk melacak latensi panggilan simpul nama HDFS untuk setiap aplikasi Spark dan mengidentifikasi hambatan simpul nama. Itu juga dapat melacak jalur file HDFS yang dibaca atau ditulis oleh setiap aplikasi Spark dan mengidentifikasi file panas untuk pengoptimalan lebih lanjut.
Profiler ini awalnya dibuat untuk membuat profil aplikasi Spark yang biasanya memiliki puluhan atau ratusan proses/mesin untuk satu aplikasi, sehingga orang dapat dengan mudah mengkorelasikan metrik dari berbagai proses/mesin tersebut. Ini juga merupakan Agen Java generik dan dapat digunakan untuk proses JVM apa pun juga.
mvn clean package
Perintah ini membuat file jvm-profiler.jar dengan reporter default seperti ConsoleOutputReporter, FileOutputReporter, dan KafkaOutputReporter yang digabungkan di dalamnya. Jika Anda ingin menggabungkan reporter khusus seperti RedisOutputReporter atau InfluxDBOutputReporter dalam file jar, berikan id profil pakar untuk reporter tersebut dalam perintah build. Misalnya untuk membuat file jar dengan RedisOutputReporter, Anda dapat menjalankan perintah mvn -P redis clean package
. Silakan periksa file pom.xml untuk mengetahui reporter khusus yang tersedia dan id profilnya.
Anda dapat mengunggah file jar jvm-profiler ke HDFS sehingga pelaksana aplikasi Spark dapat mengaksesnya. Kemudian tambahkan konfigurasi seperti berikut saat meluncurkan aplikasi Spark:
--conf spark.jars=hdfs://hdfs_url/lib/jvm-profiler-1.0.0.jar
--conf spark.executor.extraJavaOptions=-javaagent:jvm-profiler-1.0.0.jar
Perintah berikut akan memulai aplikasi contoh dengan agen profiler terpasang, yang akan melaporkan metrik ke output konsol:
java -javaagent:target/jvm-profiler-1.0.0.jar=reporter=com.uber.profiling.reporters.ConsoleOutputReporter,tag=mytag,metricInterval=5000,durationProfiling=com.uber.profiling.examples.HelloWorldApplication.publicSleepMethod,argumentProfiling=com.uber.profiling.examples.HelloWorldApplication.publicSleepMethod.1,sampleInterval=100 -cp target/jvm-profiler-1.0.0.jar com.uber.profiling.examples.HelloWorldApplication
Gunakan perintah berikut untuk menjalankan jvm profiler dengan aplikasi jar yang dapat dieksekusi.
java -javaagent:/opt/jvm-profiler/target/jvm-profiler-1.0.0.jar=reporter=com.uber.profiling.reporters.ConsoleOutputReporter,metricInterval=5000,durationProfiling=foo.bar.FooAppication.barMethod,sampleInterval=5000 -jar foo-application.jar
Atur profiler jvm di CATALINA_OPTS sebelum memulai server Tomcat. Periksa file logs/catalina.out untuk metrik.
export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/jvm-profiler/target/jvm-profiler-1.0.0.jar=reporter=com.uber.profiling.reporters.ConsoleOutputReporter,metricInterval=5000,durationProfiling=foo.bar.FooController.barMethod,sampleInterval=5000"
Gunakan perintah berikut untuk menggunakan jvm profiler dengan Spring Boot 2.x. Untuk Spring Boot 1.x gunakan -Drun.arguments
alih-alih -Dspring-boot.run.jvmArguments
pada perintah berikut.
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-javaagent:/opt/jvm-profiler/target/jvm-profiler-1.0.0.jar=reporter=com.uber.profiling.reporters.ConsoleOutputReporter,metricInterval=5000,durationProfiling=foo.bar.FooController.barMethod,sampleInterval=5000"
Uber JVM Profiler mendukung pengiriman metrik ke Kafka. Misalnya,
java -javaagent:target/jvm-profiler-1.0.0.jar=reporter=com.uber.profiling.reporters.KafkaOutputReporter,metricInterval=5000,brokerList=localhost:9092,topicPrefix=profiler_ -cp target/jvm-profiler-1.0.0.jar com.uber.profiling.examples.HelloWorldApplication
Ini akan mengirimkan metrik ke profiler topik Kafka_CpuAndMemory. Lihat bagian bawah dokumen ini untuk contoh metrik.
Lihat Entri Blog JVM Profiler.
Uber JVM Profiler mendukung fitur-fitur berikut:
Debug penggunaan memori untuk semua pelaksana aplikasi spark Anda, termasuk memori java heap, memori non-heap, memori asli (VmRSS, VmHWM), kumpulan memori, dan kumpulan buffer (buffer terarah/dipetakan).
Debug penggunaan CPU, waktu Pengumpulan Sampah untuk semua pelaksana percikan.
Debug metode kelas java sewenang-wenang (berapa kali dijalankan, berapa lama durasi yang dihabiskan). Kami menyebutnya Profil Durasi.
Debug panggilan metode kelas java sewenang-wenang dan lacak nilai argumennya. Kami menyebutnya Profil Argumen.
Lakukan Stacktrack Profiling dan buat flamegraph untuk memvisualisasikan waktu CPU yang dihabiskan untuk aplikasi percikan.
Debug metrik IO (byte baca/tulis disk untuk aplikasi, CPU menunggu untuk mesin).
Debug Metrik Thread JVM seperti Jumlah Thread Total, Thread Puncak, Thread Aktif/Aktif, dan Thread baru.
Agen Java mendukung parameter berikut, yang dapat digunakan di baris perintah Java seperti "-javaagent:agent_jar_file.jar=param1=value1,param2=value2":
reporter: nama kelas untuk reporter, misalnya com.uber.profiling.reporters.ConsoleOutputReporter, atau com.uber.profiling.reporters.KafkaOutputReporter, yang sudah diimplementasikan dalam kode. Anda dapat menerapkan reporter Anda sendiri dan menetapkan namanya di sini.
configProvider: nama kelas untuk penyedia konfigurasi, misalnya com.uber.profiling.YamlConfigProvider, yang sudah diimplementasikan dalam kode. Anda dapat menerapkan penyedia konfigurasi Anda sendiri dan menetapkan namanya di sini.
configFile: jalur file config yang akan digunakan oleh YamlConfigProvider (jika configProvider diatur ke com.uber.profiling.YamlConfigProvider). Ini bisa berupa jalur file lokal atau URL HTTP.
tag: string teks biasa yang akan dilaporkan bersama dengan metrik.
metricInterval: seberapa sering mengumpulkan dan melaporkan metrik, dalam milidetik.
DurationProfiling: konfigurasikan ke profil kelas dan metode tertentu, misalnya com.uber.profiling.examples.HelloWorldApplication.publicSleepMethod. Ini juga mendukung wildcard (*) untuk nama metode, misalnya com.uber.profiling.examples.HelloWorldApplication.*.
argumentProfiling: konfigurasikan ke argumen metode khusus profil, misalnya com.uber.profiling.examples.HelloWorldApplication.publicSleepMethod.1 (".1" berarti mendapatkan nilai untuk argumen pertama dan mengirimkannya ke reporter).
sampleInterval: frekuensi (milidetik) untuk melakukan pengambilan sampel stacktrace, jika nilai ini tidak disetel atau nol, profiler tidak akan melakukan pengambilan sampel stacktrace.
ioProfiling: apakah akan membuat profil metrik IO, bisa benar atau salah.
brokerList: daftar broker jika menggunakan com.uber.profiling.reporters.KafkaOutputReporter.
topicPrefix: awalan topik jika menggunakan com.uber.profiling.reporters.KafkaOutputReporter. KafkaOutputReporter akan mengirimkan metrik ke beberapa topik dengan nilai ini sebagai awalan untuk nama topik.
outputDir: direktori keluaran jika menggunakan com.uber.profiling.reporters.FileOutputReporter. FileOutputReporter akan menulis metrik ke dalam direktori ini.
Parameter dapat diberikan sebagai argumen dalam perintah Java, atau dalam file konfigurasi YAML jika Anda menggunakan configProvider=com.uber.profiling.YamlConfigProvider. Berikut adalah contoh file konfigurasi YAML:
reporter: com.uber.profiling.reporters.ConsoleOutputReporter
metricInterval: 5000
Berikut adalah contoh metrik CPU dan Memori saat menggunakan ConsoleOutputReporter atau KafkaOutputReporter:
{
"nonHeapMemoryTotalUsed" : 11890584.0 ,
"bufferPools" : [
{
"totalCapacity" : 0 ,
"name" : " direct " ,
"count" : 0 ,
"memoryUsed" : 0
},
{
"totalCapacity" : 0 ,
"name" : " mapped " ,
"count" : 0 ,
"memoryUsed" : 0
}
],
"heapMemoryTotalUsed" : 24330736.0 ,
"epochMillis" : 1515627003374 ,
"nonHeapMemoryCommitted" : 13565952.0 ,
"heapMemoryCommitted" : 257425408.0 ,
"memoryPools" : [
{
"peakUsageMax" : 251658240 ,
"usageMax" : 251658240 ,
"peakUsageUsed" : 1194496 ,
"name" : " Code Cache " ,
"peakUsageCommitted" : 2555904 ,
"usageUsed" : 1173504 ,
"type" : " Non-heap memory " ,
"usageCommitted" : 2555904
},
{
"peakUsageMax" : -1 ,
"usageMax" : -1 ,
"peakUsageUsed" : 9622920 ,
"name" : " Metaspace " ,
"peakUsageCommitted" : 9830400 ,
"usageUsed" : 9622920 ,
"type" : " Non-heap memory " ,
"usageCommitted" : 9830400
},
{
"peakUsageMax" : 1073741824 ,
"usageMax" : 1073741824 ,
"peakUsageUsed" : 1094160 ,
"name" : " Compressed Class Space " ,
"peakUsageCommitted" : 1179648 ,
"usageUsed" : 1094160 ,
"type" : " Non-heap memory " ,
"usageCommitted" : 1179648
},
{
"peakUsageMax" : 1409286144 ,
"usageMax" : 1409286144 ,
"peakUsageUsed" : 24330736 ,
"name" : " PS Eden Space " ,
"peakUsageCommitted" : 67108864 ,
"usageUsed" : 24330736 ,
"type" : " Heap memory " ,
"usageCommitted" : 67108864
},
{
"peakUsageMax" : 11010048 ,
"usageMax" : 11010048 ,
"peakUsageUsed" : 0 ,
"name" : " PS Survivor Space " ,
"peakUsageCommitted" : 11010048 ,
"usageUsed" : 0 ,
"type" : " Heap memory " ,
"usageCommitted" : 11010048
},
{
"peakUsageMax" : 2863661056 ,
"usageMax" : 2863661056 ,
"peakUsageUsed" : 0 ,
"name" : " PS Old Gen " ,
"peakUsageCommitted" : 179306496 ,
"usageUsed" : 0 ,
"type" : " Heap memory " ,
"usageCommitted" : 179306496
}
],
"processCpuLoad" : 0.0008024004394748531 ,
"systemCpuLoad" : 0.23138430784607697 ,
"processCpuTime" : 496918000 ,
"appId" : null ,
"name" : " 24103@machine01 " ,
"host" : " machine01 " ,
"processUuid" : " 3c2ec835-749d-45ea-a7ec-e4b9fe17c23a " ,
"tag" : " mytag " ,
"gc" : [
{
"collectionTime" : 0 ,
"name" : " PS Scavenge " ,
"collectionCount" : 0
},
{
"collectionTime" : 0 ,
"name" : " PS MarkSweep " ,
"collectionCount" : 0
}
]
}
Daftar semua metrik dan informasi terkait dapat ditemukan di sini.
Kita dapat mengambil output dari Stacktrack Profiling untuk menghasilkan flamegraph guna memvisualisasikan waktu CPU. Menggunakan skrip Python stackcollapse.py
, perintah berikut akan menciutkan file keluaran json Stacktrack Profiling ke format file masukan untuk menghasilkan flamegraph. Skrip flamegraph.pl
dapat ditemukan di FlameGraph.
python stackcollapse.py -i Stacktrace.json > Stacktrace.folded
flamegraph.pl Stacktrace.folded > Stacktrace.svg
Perhatikan bahwa pengambilan sampel stacktrace harus diaktifkan untuk menghasilkan flamegraph. Untuk mengaktifkannya, silakan atur parameter sampleInterval
. Jika tidak disetel atau nol, profiler tidak akan melakukan pengambilan sampel stacktrace.