跳轉至

故障排查 / 函數執行超時

函數執行超時可能有多種可能,需要根據不同情況進行辨別。

1. 在 DataFlux Func UI 編輯器中執行耗時過長的函數

為保護系統,對於在 DataFlux Func 編輯器中執行函數,系統會忽略 timeout 配置,耗時限制固定為 45 秒

當函數執行時間超過耗時限制後,系統會直接 Kill 進程,並拋出類似如下錯誤:

Text Only
1
2
3
4
5
6
7
8
#1 --------------------
執行函數: demo__demo.test_timeout()

錯誤堆棧:
Traceback (most recent call last):
  File "demo__demo", line 4, in test_timeout
    time.sleep(100)
billiard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()
可能原因 解決方案
所執行的函數運行超過 45 秒限制 在編輯器中執行函數主要用於開發 / 調試,應當使用較小的數據集、請求量
請勿直接執行完整長耗時任務

2. 函數執行耗時過長導致工作進程被 Kill

為了保護系統,DataFlux Func 對函數執行的最長時間有限制,不允許無限制運行下去。 在超過一定時間後,會直接 Kill 執行進程。

具體表現為:

  1. 在任務執行的日誌中觀察到產生包含 SoftTimeLimitExceeded 的錯誤,如:
Text Only
1
2
3
4
Traceback (most recent call last):
  File "demo__demo", line 4, in test_timeout
    time.sleep(100)
billiard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()
  1. 調用函數 API 返回狀態碼 599,返回包含 EFuncTimeout(一般也會包含 SoftTimeLimitExceeded 信息)的如下數據:
JSON
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
{
    "detail": {
        "einfoTEXT": "raise SoftTimeLimitExceeded()\nbilliard.exceptions.SoftTimeLimitExceeded: SoftTimeLimitExceeded()",
        "id": "task-xxxxx"
    },
    "error": 599.31,
    "message": "Calling Function timeout.",
    "ok": false,
    "reason": "EFuncTimeout",
    "reqCost": 5020,
    "reqDump": {
        "method": "GET",
        "url": "/api/v1/al/func-api-xxxxx"
    },
    "traceId": "TRACE-xxxxx"
}

其中,reqCost字段為此函數從開始執行到被 Kill 經過的時間(毫秒)

可能原因及解決方案:

可能原因 解決方案
所執行的函數未指定 timeout 超時參數,但函數運行超過默認超時限制 聯繫函數開發者排查錯誤,包括且不限於:
超時參數設置過短
函數內調用外部系統響應過慢
所執行的函數指定了 timeout 超時參數(秒),且函數運行超時 同上

函數超時默認為 30 秒,最大設置為 3600 秒

X. 參考文檔