最近生產頻繁遇到flink的tm掛掉的情況,查看了日誌發現如下內存使用情況
可見出現峯值,觸發了系統的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 是不會關閉的。