您好,登錄后才能下訂單哦!
這篇文章主要介紹“如何實現容器中生成火焰圖”,在日常操作中,相信很多人在如何實現容器中生成火焰圖問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”如何實現容器中生成火焰圖”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
Arthas(阿爾薩斯)是阿里巴巴開源的 Java 診斷工具,深受開發者喜愛。
當你遇到以下類似問題而束手無策時,Arthas 可以幫助你解決:
這個類從哪個 jar 包加載的?為什么會報各種類相關的 Exception?
我改的代碼為什么沒有執行到?難道是我沒 commit?分支搞錯了?
遇到問題無法在線上 debug,難道只能通過加日志再重新發布嗎?
線上遇到某個用戶的數據處理有問題,但線上同樣無法 debug,線下無法重現!
是否有一個全局視角來查看系統的運行狀況?
有什么辦法可以監控到JVM的實時運行狀態?
arthas的github倉庫中曾經有人提過這樣一個issue。錯誤信息如下:
Perf events unavailable. See stderr of the target process.
為什么我要寫這篇博客,筆者在arthas官方倉庫中發現官方的回復里只是給了一個指向async-profiler官方的地址, 很多人可能順著給出的地址去async-profiler官方文檔看了也是非常的懵。并且async-profiler描述也不一定找到好的解決方案。 因此,寫這邊博客的目的是幫助大家后續在遇到這個問題時能夠有一個其它的方案去解決問題。 下面筆者將帶著大家一步一步的解決,arthas在容器中生成火焰圖報錯的問題。
如何在自己的鏡像中添加arthas,請直接看官方網站,如果不了解的怎么使用arthas的同學也請先去官網看資料。
生成火焰圖:
[arthas@1]$ profiler start AsyncProfiler error: /opt/arthas/async-profiler/libasyncProfiler-linux-x64.so: libstdc++.so.6: cannot open shared object file or directory
執行命令后發現alpine
基礎鏡像中缺乏libstdc++.so.6
庫,遇事不要慌,現在安裝下libstdc++。
[root@node-znjj-131-146 testYaml]# kubectl exec -it springboot-tomcat-deployment-7577ccdd9d-4rpc4 /bin/bash bash-4.4# apk add libstdc++ fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz (1/1) Installing libstdc++ (8.3.0-r0) Executing glibc-bin-2.29-r0.trigger OK: 32 MiB in 39 packages
安裝完成后在執行arthas的生成火焰圖命令。
[arthas@1]$ profiler start Perf events unavailable. See stderr of the target process.
不好了,又出現了新的問題了。這個問題通常是出現在容器環境中。 arthus實際是利用async-profiler
去完成的。在async-profiler官方地址的README中有提到改問題。
Perf events unavailble. See stderr of the target process.
perf_event_open() syscall has failed. The error message is printed to the error stream of the target JVM.
Typical reasons include:
/proc/sys/kernel/perf_event_paranoid is set to restricted mode (>=2). /proc/sys/kernel/perf_event_paranoid 設置為受限模式(> = 2)
seccomp disables perf_event_open API in a container(seccomp禁用容器中的perf_event_open API。).
OS runs under a hypervisor that does not virtualize performance counters.(操作系統在不虛擬化性能計數器的管理程序下運行。)
perf_event_open API is not supported on this system, e.g. WSL.(該系統不支持perf_event_open API,例如WSL。)
我們這里來好看下系統的/proc/sys/kernel/perf_event_paranoid
這個配置項。
bash-4.4# cat /proc/sys/kernel/perf_event_paranoid 2
發現該系統配置參數的值確實是大于等于2。 根據官方文檔的描述。嘗試將/proc/sys/kernel/perf_event_paranoid
的值設置為1。
bash-4.4# echo 1 > /proc/sys/kernel/perf_event_paranoid bash-4.4# bash: /proc/sys/kernel/perf_event_paranoid: Read-only file system
說明權限不足。這時問題又來,通常情況下基礎鏡像的都是使用的非root權限。如果我們硬要修改這個配置項,第一想到的可能只能重新構建鏡像了。在構建鏡像的時候修改基礎鏡像的用戶,然后設置系統參數。
這帶來了新的問題:
新的基礎鏡像變更后帶來了安全問題。
所有需要的嘗試生成火焰圖的更改基礎鏡像。
這是稍微思考下,我們發現kubernetes下或者docker中都允許我們變更容器的權限。
在docker中可以使用--cap-add SYS_ADMIN
命令選項來指定。
docker run --cap-add=SYS_ADMIN {container}
在kubernetes中可以通過securityContext
來設置。修改你的deployment部署文件,配置參考如下。
containers: - name: springboot-tomcat image: registry.cn-shanghai.aliyuncs.com/shalousun/springboot:2.3.4-tomcat imagePullPolicy: Always securityContext: capabilities: add: ["SYS_ADMIN"]
配置好后重新在kubernetes中部署就好了。部署好重新進入容器后就可以正常按照arthas官方的命令執行了。
[arthas@1]$ profiler start Started [cpu] profiling [arthas@1]$ profiler getSamples 3 [arthas@1]$ profiler status [perf] profiling is running for 28 seconds [arthas@1]$ profiler stop OK profiler output file: /arthas-output/20201109-181906.svg
到此,關于“如何實現容器中生成火焰圖”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。