天天看點

大量執行OSS PutObject時卡住的問題排查

接到有客戶回報,在批量putobject時,發現上傳到一定數量後應用卡住了,同時句柄數增加明顯。

客戶表示

1.使用10個worker線程進行put操作。

2.每個線程獨立使用OssClient。

3.OssClient沒有執行shutdown

根據客戶的描述,寫了一個類似的程式來進行複現

開啟五個線程,每個線程上傳10000次object來測試

測試5W次上傳請求正常。

而在增加callback後出現了問題

大量執行OSS PutObject時卡住的問題排查

看到上傳确實卡住了。減少到1個線程,依然如此,看來并非是線程導緻。

在putobject上傳的時候,同時也會看到javaw程序的句柄數不斷增加。

通過和OSS後端同學确認,在putobject時,如果沒有callback是不需要句柄開銷的。但如果

PutObjectResult putObjectResult = ossClient.putObject(putObjectRequest);

即使不顯性的read,那麼也會産生句柄開銷。而目前的句柄數是1000,當句柄數用完也就無法配置設定新的句柄導緻程式卡住。需要增加

putObjectResult.getCallbackResponseBody().close();

添加後測試,測試OK

大量執行OSS PutObject時卡住的問題排查

繼續閱讀