前言:由于公司后期決定所有云平臺(tái)采用容器部署,所有java服務(wù)都部署到容器中焚刺,用k8s進(jìn)行應(yīng)用部署敛摘,規(guī)劃,更新乳愉,維護(hù)的一種機(jī)制兄淫。
問(wèn)題:在變更部署環(huán)境后一段時(shí)間內(nèi),由于公司人事變動(dòng)問(wèn)題蔓姚,沒(méi)有對(duì)變更環(huán)境的項(xiàng)目進(jìn)行測(cè)試捕虽。近期用戶反饋,人臉?shù)洸贿M(jìn)系統(tǒng)坡脐。
解決過(guò)程:1.查看系統(tǒng)內(nèi)的日志泄私,發(fā)現(xiàn)一個(gè)疑點(diǎn),每次調(diào)用完人臉接口后备闲,java程序就GC晌端,容器直接重啟。開(kāi)始懷疑是虹軟人臉識(shí)別需要消耗大量?jī)?nèi)存恬砂,超過(guò)容器限制的內(nèi)存咧纠,而導(dǎo)致的由于內(nèi)存溢出(OOM),容器已被殺掉泻骤;后續(xù)分配了自定義內(nèi)存后還是會(huì)重啟漆羔。
2.在網(wǎng)上一波百度后發(fā)現(xiàn)可能是jdk版本的問(wèn)題,突然想起之前換環(huán)境是狱掂,做鏡像的同事說(shuō)原先的jdk打包出來(lái)的鏡像太大了演痒,換了個(gè)jdk。一下子思路就打開(kāi)了符欠,我馬上修改了dockerfile里面構(gòu)建依賴(lài)的基礎(chǔ)鏡像嫡霞,回歸到原先的jdk。運(yùn)行后果然不再重啟了希柿,但是報(bào)了另外一個(gè)錯(cuò)誤
(PS:java.lang.UnsatisfiedLinkError: /usr/lib64/libarcsoft_face_engine_jni.so: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21' not found (required by /usr/lib64/libarcsoft_face_engine.so))
3.因?yàn)楹畿浫四樧R(shí)別的so文件有三個(gè)诊沪,都是通過(guò)dockerfile里面指令復(fù)制進(jìn)去的,百度出來(lái)是libstdc++.so.6.0.14版本太低曾撤,后續(xù)下載了libstdc++.so.6.0.21然后重新創(chuàng)建軟鏈接端姚,在Dockerfile中的指令。之后就解決了這個(gè)問(wèn)題挤悉。
(PS:
RUN rm-rf/usr/lib64/libstdc++.so.6
RUN ln-s/usr/lib64/libstdc++.so.6.0.26 /usr/lib64/libstdc++.so.6
)
總結(jié):過(guò)程說(shuō)出來(lái)就那么點(diǎn)渐裸,但是在解決過(guò)程中走了很多彎路,猶豫JDK的更改還帶來(lái)了其他很多問(wèn)題,比如原先的導(dǎo)出下載也出現(xiàn)了bug昏鹃,換了JDK后docker中的centos的版本跟原先的不同也導(dǎo)致了后續(xù)這個(gè)版本太低的問(wèn)題尚氛。所以對(duì)Java程序來(lái)說(shuō),在單體應(yīng)用架構(gòu)中會(huì)集成很多第三方組件洞渤,就會(huì)遇到當(dāng)環(huán)境變更而帶來(lái)的一系列問(wèn)題阅嘶。