Contents

Playwright 程式碼執行時發生記憶體不足錯誤

Contents

最近 .Net 排成程式發生 OOM,奇怪我該關閉程式都有做,但我發現我少一個變數少做 using,所以造成問題。

觀察

我發現有多個子程序沒有關閉,我們從docker top {container_id}可以觀察子程序。忘記這個指令也可以從topps 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