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服務器地址。 如果使用阿里云文件存儲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瀏覽器可以參考以下方式開啟權限:
打開彈性容器實例控制臺,單擊瀏覽器地址欄前面的圖標,選擇網站設置。
將配置項不安全內容改為允許。