最近 .Net 排成程式發生 OOM,奇怪我該關閉程式都有做,但我發現我少一個變數少做 using
,所以造成問題。
觀察
我發現有多個子程序沒有關閉,我們從docker top {container_id}
可以觀察子程序。忘記這個指令也可以從top
、ps aux
去做觀察。因為我這個排程每 15 分鐘會跑一次,所以放個3天就會發生。我們可以看到cli.js
沒有關閉。
1
2
3
4
5
|
docker top webcrawlerapi-webcrawlerapi-1
UID PID PPID C STIME TTY TIME CMD
root 137707 137686 7 21:30 ? 00:00:04 dotnet WebCrawlerApi.dll
root 137757 137707 1 21:30 ? 00:00:01 /app/out/.playwright/node/linux-x64/node /app/out/.playwright/package/cli.js run-driver
root 137832 137707 2 21:30 ? 00:00:01 /app/out/.playwright/node/linux-x64/node /app/out/.playwright/package/cli.js run-driver
|
這裡搜尋到很多程序,我懷疑這些是不是殭屍程式,這邊 Google 找到 Docker 子程序會有殭屍程式問題,但最後跟那個沒有關係。
我的程式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
_logger.LogInformation($"RutenGoodPriceJob({rl.username}) is running.");
var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true });
await using var context = await browser.NewContextAsync(playwright.Devices["Desktop Chrome"]);
var page = await context.NewPageAsync();
// await page.SetViewportSizeAsync(1920, 1080);
await page.GotoAsync(rutenUrl);
await page.WaitForSelectorAsync(".rt-product-card");
var items = await page.QuerySelectorAllAsync(".rt-product-card");
var newItems = new List<string>();
...
finally
{
await context.CloseAsync();
await browser.CloseAsync();
}
|
我後來發現 playwright
沒有做 using
,問題就這麼簡單地解決了。
我最後觀察沒看到多個程式了,但不確定這是否算是殭屍程序?
1
2
3
4
|
docker top webcrawlerapi-webcrawlerapi-1
UID PID PPID C STIME TTY TIME
CMD
root 143870 143850 6 21:37 ? 00:00:04 dotnet WebCrawlerApi.dll
|