coredump是指在程式運行過程中發生異常終止或崩潰時,作業系統將程式的記憶體內容轉儲到一個特殊的檔案中,以便於後續的調試和分析。本文介紹如何為ECI執行個體開啟coredump,以便在容器異常終止時可以查看分析coredump產生的檔案,從而定位問題原因,修複程式異常。
背景資訊
在Linux中,如果程式突然異常終止或者崩潰,作業系統會將程式當時的記憶體狀態記錄下來,儲存在一個檔案中,這種行為就叫做coredump。此時,您可以查看分析coredump產生的core檔案,找出問題原因。
Linux中支援coredump(Action為Core)的Signal如下圖所示。
更多資訊,請參見coredump file。
功能概述
ECI預設關閉coredump,避免磁碟佔用過多而導致業務不可用。您可以根據需要選擇以下一種方式開啟coredump:
方式一:開啟coredump營運任務
手動開啟coredump後,將產生一個營運任務。在容器運行異常終止或者退出時,觸發coredump產生的core檔案將自動儲存到OSS中。
方式二:自訂設定core檔案儲存路徑
支援自訂設定core檔案儲存到外掛儲存中,設定儲存路徑後,將自動開啟coredump。在容器運行異常終止或者退出時,觸發coredump產生的core檔案,將儲存到指定的外掛儲存的路徑下。
方式一便於操作,但有時效和地區等限制,可用於臨時調試和診斷程式。
產生的營運任務為一次性任務,執行成功擷取到一次core檔案後,將會關閉coredump,並且營運任務有一定的期限(12小時),超出時間後任務將會失效。
不支援以下地區:華北6(烏蘭察布)、華南2(河源)、華南3(廣州)、華東5(南京-本地地區)、菲律賓(馬尼拉)、韓國(首爾)、泰國(曼穀)。
方式二需要額外配置外掛儲存,在程式運行狀態不穩定的情況下,可以採用該方式確保能夠擷取到core檔案,但如果程式有問題,反覆重啟可能會產生大量core檔案。
方式一:開啟coredump營運任務
控制台
為ECI執行個體開啟coredump。
單擊目標執行個體ID,開啟執行個體詳情頁面。
單擊營運頁簽,然後選擇Coredump頁簽,單擊開啟。
開啟coredump後,系統將產生一個營運任務,未觸發coredump時,任務狀態為等待中。
觸發coredump。
串連ECI執行個體,在容器內執行
sleep 100
命令後按Ctrl
+\
鍵,觸發coredump,產生的core檔案將自動儲存到OSS中。下載core檔案。
觸發coredump產生core檔案後,營運任務的狀態將變為成功,此時單擊對應結果列中的下載即可下載core檔案到本地。
說明如果下載沒有反應,請檢查瀏覽器的網站使用權限設定。
OpenAPI
為ECI執行個體開啟coredump。
調用CreateInstanceOpsTask介面建立營運任務,需指定目標ECI執行個體,然後將OpsType設為
coredump
,OpsValue設為enable
,即可開啟coredump。更多資訊,請參見CreateInstanceOpsTask。說明指定ECI執行個體時,需確保目標ECI執行個體在建立時沒有設定CorePattern。
觸發coredump。
串連ECI執行個體,在容器內執行
sleep 100
命令後按Ctrl
+\
鍵,觸發coredump,產生的core檔案將自動儲存到OSS中。下載Core檔案。
調用DescribeInstanceOpsRecords介面查看營運任務的結果,從返回資訊的ResultContent中,可以擷取core檔案儲存在OSS中的地址,訪問該地址即可下載core檔案。
方式二:自訂設定core檔案儲存路徑
core檔案一般用於離線分析問題,因此設定core檔案的儲存路徑時,一般採用外掛儲存,而不是儲存在容器本地路徑,避免容器退出而丟失core檔案。ECI支援自訂設定core檔案儲存路徑,設定後將自動開啟coredump。
調用CreateContainerGroup介面建立ECI執行個體時,可傳入CorePattern參數來設定core檔案儲存路徑。相關參數說明如下,更多資訊,請參見CreateContainerGroup。
樣本以NFSVolume作為樣本,Volume相關參數請根據實際Volume類型進行配置。
名稱 | 類型 | 樣本值 | 描述 |
CorePattern | String | /data/dump-a/core | 自訂設定Core dump檔案的儲存目錄。 重要 配置的路徑不能以 |
Volume.N.Name | String | volume1 | 資料卷名稱。 |
Volume.N.Type | String | NFSVolume | 資料卷類型。本文以NFSVolume為例。 |
Volume.N.NFSVolume.Path | String | /dump | NFS資料卷的路徑。 |
Volume.N.NFSVolume.Server | String | 143b24****-gfn3.cn-beijing.nas.aliyuncs.com | NFS伺服器位址。 如果使用阿里雲Apsara File Storage NAS,則此處為NAS檔案系統的掛載點地址。 |
Container.N.VolumeMount.N.Name | String | volume1 | 要掛載到容器的資料卷的名稱,對應Volume.N.Name的值。 |
Container.N.VolumeMount.N.MountPath | String | /data/dump-a/ | 掛載目錄。 容器掛載目錄下的內容會被資料卷的內容直接覆蓋,請準確填寫。 |
以使用NAS作為外掛儲存為例,樣本如下:
建立一台ECI執行個體A,掛載NAS並設定core檔案儲存路徑。
調用CreateContainerGroup介面建立ECI執行個體A時傳入以下參數,將NAS的
/dump/
目錄掛載到容器的/data/dump-a/
目錄,將core檔案儲存路徑設定為/data/dump-a/core
。ContainerGroupName=test-a SecurityGroupId=sg-bp1daxpbz9lzpvvc**** VSwitchId=vsw-bp1gds63lmlm7ib05**** # 聲明資料卷 Volume.1.Name=volume1 Volume.1.Type=NFSVolume Volume.1.NFSVolume.Path=/dump/ Volume.1.NFSVolume.Server=143b24****-gfn3.cn-beijing.nas.aliyuncs.com # 為容器掛載資料卷 Container.1.Name=nginx Container.1.Image=registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 Container.1.VolumeMount.1.Name=volume1 Container.1.VolumeMount.1.MountPath=/data/dump-a/ # 設定core檔案儲存路徑 CorePattern=/data/dump-a/core
在執行個體A的容器任意目錄下觸發coredump。
如下樣本,在容器內執行
sleep 100
命令後同時按Ctrl
鍵和\
鍵,觸發coredump後,core檔案已儲存到容器的/data/dump-a/
路徑下。釋放ECI執行個體A。
將同一NAS掛載到另一台ECI執行個體B。
調用CreateContainerGroup介面建立ECI執行個體B時傳入以下參數,將同一NAS的
/dump/
目錄掛載到容器的/data/dump-b/
目錄。ContainerGroupName=test-nas-b SecurityGroupId=sg-bp1daxpbz9lzpvvc**** VSwitchId=vsw-bp1gds63lmlm7ib05**** # 聲明資料卷 Volume.1.Name=volume1 Volume.1.Type=NFSVolume Volume.1.NFSVolume.Path=/dump/ Volume.1.NFSVolume.Server=143b24****-gfn3.cn-beijing.nas.aliyuncs.com # 為容器掛載資料卷 Container.1.Name=nginx Container.1.Image=registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 Container.1.VolumeMount.1.Name=volume1 Container.1.VolumeMount.1.MountPath=/data/dump-b/
在執行個體B的容器中查看core檔案。
如下樣本,在容器的
/data/dump-b/
路徑下可以看到core檔案,core檔案儲存到外掛儲存後,並沒有隨著執行個體A的釋放而丟失,您仍可以查看分析core檔案。
常見問題
觸發coredump後,在控制台下載core檔案沒有反應,怎麼辦?
如果下載沒有反應,請檢查瀏覽器的網站使用權限設定。例如Chrome瀏覽器可以參考以下方式開啟許可權:
開啟Elastic Container Instance控制台,單擊瀏覽器地址欄前面的表徵圖,選擇網站設定。
將配置項不安全內容改為允許。