flink實戰-處理oom問題

最近生產頻繁遇到flink的tm掛掉的情況,查看了日誌發現如下內存使用情況

20200519091357

可見出現峯值,觸發了系統的oom-killer程序,通過查看下系統日誌 /var/log/messages 確認了的確觸發的系統oom-killer

[ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
[21862]   978 21862  2103161   249370     733        0             0 java
[12678]     0 12623  2036524   667896    1618        0             0 java
Out of memory: Kill process 12678 (java) score 159 or sacrifice child

後面查看內存使用突增的原因是因爲增加了幾個定時任務,導致內存使用超過系統限制,觸發了oom-killer,而它又是挑個最大使用的程序進行刪除,所以部署到tm就被誤殺了。

這裏flink集羣是使用standalone的搭建的,所以使用supervisor來監控拉起被誤殺的tm,配置如下

[program:flink_taskmanager]
environment = JAVA_HOME="/opt/jdk1.8.0_102"
directory=/opt/flink-1.9.1/bin ; 項目路勁
command=/opt/flink-1.9.1/bin/taskmanager.sh start-foreground ; 啓動命令
autostart=false ; supervisord啓動時是否啓動
autorestart=true ; 這個是設置子進程掛掉後自動重啓的情況,有三個選項,false,unexpected和true。如果爲false的時候,無論什麼情況下,都不會被重新啓動,如果爲unexpected,只有當進程的退出碼不在下面的exitcodes裏面定義的退出碼的時候,纔會被自動重啓。當爲true的時候,只要子進程掛掉,將會被無條件的重啓
startretries=10 ; 當進程啓動失敗後,最大嘗試啓動的次數。。當超過3次後,supervisor將把此進程的狀態置爲FAIL默認值爲3
startsecs=1 ; 這個選項是子進程啓動多少秒之後,此時狀態如果是running,則我們認爲啓動成功了
stopasgroup=true ; 這個東西主要用於,supervisord管理的子進程,這個子進程本身還有子進程。那麼我們如果僅僅幹掉supervisord的子進程的話,子進程的子進程有可能會變成孤兒進程。所以咱們可以設置可個選項,把整個該子進程的整個進程組都幹掉。設置爲true的話,一般killasgroup也會被設置爲true。 需要注意的是,該選項發送的是stop信號
killasgroup=true ; 這個和上面的stopasgroup類似,不過發送的是kill信號
user=root ;腳本運行的用戶身份
stderr_logfile=/data/flink-log/supervisor/flink_taskmanager_stderr.log #日誌輸出
stdout_logfile=/data/flink-log/supervisor/flink_taskmanager_stdout.log #日誌輸出
redirect_stderr = true ; 把 stderr 重定向到 stdout,默認 false
stdout_logfile_maxbytes=200MB ;stdout 日誌文件大小,默認 50MB
stdout_logfile_backups=10 ;stdout 日誌文件備份數

具體如何配置supervisor查看之前的文章

注意需要配置下 JAVA_HOME 的環境變量以及使用 start-foreground 來啓動 tm 否則,就會一直重啓。 同時 ./taskmanager.sh stop 是關閉後臺deamon進程的。如果使用start-foreground 是不會關閉的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章