[{"data":1,"prerenderedAt":625},["ShallowReactive",2],{"content-/deploy-speed-defender-and-repo-push-audit":3,"all-pages-for-dir":603,"related-/deploy-speed-defender-and-repo-push-audit":604,"og-image-/deploy-speed-defender-and-repo-push-audit":624},{"id":4,"title":5,"body":6,"category":585,"concepts":586,"description":587,"extension":588,"meta":589,"navigation":544,"ogImage":586,"path":590,"project_name":591,"published":592,"publishedAt":593,"seo":594,"source":595,"stem":596,"tags":597,"todo":586,"unpublished":592,"updatedAt":586,"__hash__":602},"pages/2026-08/2026-08-19/deploy-speed-defender-and-repo-push-audit.md","Windows Defenderの除外でNuxtのビルドは半分になったが、記事のプリレンダーは16%しか縮まなかった",{"type":7,"value":8,"toc":572},"minimark",[9,13,17,20,24,27,50,53,56,203,206,209,213,216,343,346,349,352,355,358,365,369,376,433,440,443,450,454,457,460,464,471,474,477,481,484,487,491,494,497,500,503,510,521,528,531,568],[10,11,5],"h1",{"id":12},"windows-defenderの除外でnuxtのビルドは半分になったが記事のプリレンダーは16しか縮まなかった",[14,15,16],"p",{},"Macで4分40秒で終わるデプロイが、Windowsでは20分を超える。\n前の晩に1回目を測ったときは、Windows Defenderの除外を入れないまま回した。\n除外の投入には管理者権限が要るのに、その場でUACを出せなかったからだ。\n条件として残っていたのはそこだけだったので、除外を入れればMacの数字に近づくと踏んでいた。",[14,18,19],{},"「Defender除外を入れてrun2を測る」というタスクは、そのまま積み残しになっていた。\nこれを引き出して、計画書ごと読ませるところから始めた。",[21,22,23],"h2",{"id":23},"条件を1つだけ変えて回す",[14,25,26],{},"比べる相手は前日の21分44秒である。\n変える要素を1つに絞らないと、あとで何が効いたのか言えなくなる。",[14,28,29,30,34,35,38,39,42,43,46,47,49],{},"除外を投入するために、",[31,32,33],"code",{},"Start-Process powershell -Verb RunAs"," でUACを出させた。\nこちらは「はい」を押すだけで済む。\n入れたのはリポジトリのパスと、",[31,36,37],{},"node.exe"," と ",[31,40,41],{},"pnpm.exe"," の2プロセスである。\n最初は ",[31,44,45],{},"pnpm.cmd"," を指定しかけたが、これは実行イメージではないので除外にならない。\nmiseが置いている ",[31,48,41],{}," のほうに読み替えさせた。",[14,51,52],{},"メモリは開始前に空きが5.3GBまで落ちていた。\n古いchrome-devtools MCPを3本止めて7.8GBに戻した（run1は8.2GB）。\ndevサーバー2本は別セッションが使っていたので残した。\nビルドキャッシュも前回と同じく消してから始めた。",[21,54,55],{"id":55},"段階別に前日と並べる",[57,58,59,85],"table",{},[60,61,62],"thead",{},[63,64,65,69,73,76,79,82],"tr",{},[66,67,68],"th",{},"段階",[66,70,72],{"align":71},"right","Mac",[66,74,75],{"align":71},"run1",[66,77,78],{"align":71},"run2",[66,80,81],{"align":71},"run2/run1",[66,83,84],{"align":71},"run2/Mac",[86,87,88,109,129,149,167,185],"tbody",{},[63,89,90,94,97,100,103,106],{},[91,92,93],"td",{},"クライアントビルド",[91,95,96],{"align":71},"28.2秒",[91,98,99],{"align":71},"218.2秒",[91,101,102],{"align":71},"98.5秒",[91,104,105],{"align":71},"0.45",[91,107,108],{"align":71},"3.5倍",[63,110,111,114,117,120,123,126],{},[91,112,113],{},"サーバービルド",[91,115,116],{"align":71},"28.4秒",[91,118,119],{"align":71},"167.6秒",[91,121,122],{"align":71},"94.5秒",[91,124,125],{"align":71},"0.56",[91,127,128],{"align":71},"3.3倍",[63,130,131,134,137,140,143,146],{},[91,132,133],{},"プリレンダー",[91,135,136],{"align":71},"75.7秒",[91,138,139],{"align":71},"454.4秒",[91,141,142],{"align":71},"383.4秒",[91,144,145],{"align":71},"0.84",[91,147,148],{"align":71},"5.1倍",[63,150,151,154,156,159,162,165],{},[91,152,153],{},"検証スクリプト（未公開記事）",[91,155],{"align":71},[91,157,158],{"align":71},"178.4秒",[91,160,161],{"align":71},"33.8秒",[91,163,164],{"align":71},"0.19",[91,166],{"align":71},[63,168,169,172,174,177,180,183],{},[91,170,171],{},"検証スクリプト（機密漏れ）",[91,173],{"align":71},[91,175,176],{"align":71},"32.0秒",[91,178,179],{"align":71},"3.3秒",[91,181,182],{"align":71},"0.10",[91,184],{"align":71},[63,186,187,190,192,195,198,201],{},[91,188,189],{},"合計（アップロード無し）",[91,191],{"align":71},[91,193,194],{"align":71},"21分44秒",[91,196,197],{"align":71},"11分30秒",[91,199,200],{"align":71},"0.53",[91,202],{"align":71},[14,204,205],{},"サーバービルドが94.5秒で抜けた通知を見た時点では、勝ったと思った。\nプリレンダーの進みも1秒あたり36ルートで、run1平均の17ルートのおよそ倍で流れていた。",[14,207,208],{},"そのままプリレンダーの完了を待って、7,831ルートで383.4秒と出た。\nrun1が454.4秒だから、16%しか縮んでいない。\nビルドが2倍速になった横で、いちばん重い工程だけが動かなかった。",[21,210,212],{"id":211},"どのルートが縮んでどのルートが縮まなかったか","どのルートが縮んで、どのルートが縮まなかったか",[14,214,215],{},"ルート種別ごとにrun1とrun2を並べさせると、境界がはっきり出た。",[57,217,218,237],{},[60,219,220],{},[63,221,222,225,228,231,234],{},[66,223,224],{},"種別",[66,226,227],{"align":71},"本数",[66,229,230],{"align":71},"run1平均",[66,232,233],{"align":71},"run2平均",[66,235,236],{"align":71},"比",[86,238,239,256,275,292,309,326],{},[63,240,241,244,247,250,253],{},[91,242,243],{},"マークダウン記事",[91,245,246],{"align":71},"1,764",[91,248,249],{"align":71},"3,083ms",[91,251,252],{"align":71},"3,121ms",[91,254,255],{"align":71},"1.01",[63,257,258,263,266,269,272],{},[91,259,260],{},[31,261,262],{},"_payload.json",[91,264,265],{"align":71},"3,863",[91,267,268],{"align":71},"163ms",[91,270,271],{"align":71},"128ms",[91,273,274],{"align":71},"0.78",[63,276,277,280,283,286,289],{},[91,278,279],{},"タグ一覧",[91,281,282],{"align":71},"574",[91,284,285],{"align":71},"1,005ms",[91,287,288],{"align":71},"852ms",[91,290,291],{"align":71},"0.85",[63,293,294,297,300,303,306],{},[91,295,296],{},"Vueページ（理科）",[91,298,299],{"align":71},"66",[91,301,302],{"align":71},"2,772ms",[91,304,305],{"align":71},"1,363ms",[91,307,308],{"align":71},"0.49",[63,310,311,314,317,320,323],{},[91,312,313],{},"Vueページ（決算）",[91,315,316],{"align":71},"78",[91,318,319],{"align":71},"1,048ms",[91,321,322],{"align":71},"533ms",[91,324,325],{"align":71},"0.51",[63,327,328,331,334,337,340],{},[91,329,330],{},"コーディング規約",[91,332,333],{"align":71},"163",[91,335,336],{"align":71},"2,943ms",[91,338,339],{"align":71},"1,946ms",[91,341,342],{"align":71},"0.66",[14,344,345],{},"Defenderが効いていたのは、JSチャンクを次々に開くVueページと、distの1万4千ファイルを読み歩く検証スクリプトだった。\n検証スクリプトが5倍から10倍まで速くなったのはそのためで、合計を47%押し下げたのも主にここである。",[14,347,348],{},"一方、記事は1.01でぴくりとも動いていない。\n記事1,764本はプリレンダー総コストの6割を占める。\nいちばん太い6割を素通りしたまま、合計だけが半分になった。",[14,350,351],{},"Defenderは主犯の一人ではあった。\nただし、単独犯ではなかった。",[21,353,354],{"id":354},"並列数はいくつで走っていたのか",[14,356,357],{},"ついでに並列数を確認させたら、Nuxtがプリレンダーの同時実行数にCPUスレッド数の4倍を入れていた。\nこの機は16スレッドなので64、Macは72になる。",[14,359,360,361,364],{},"6月に「",[31,362,363],{},"concurrency: 8"," にしたら遅くなった」と書いたまま放ってあった件は、これで説明がつく。\nNitro単体の既定である1から8へ増やしたつもりでいたが、実際には64から8へ減らしていた。\n自分で書いた過去の記述が、2か月遅れで逆向きの意味になった。",[21,366,368],{"id":367},"_1記事あたりのssrだけを測るハーネス","1記事あたりのSSRだけを測るハーネス",[14,370,371,372,375],{},"11分かかる計測を1回ずつ回して当てずっぽうを続けても進まない。\nプリレンダー用バンドルがexportしている ",[31,373,374],{},"localFetch"," を直接叩いて、記事1本あたりのSSR時間だけを取るハーネスを書かせた。",[377,378,383],"pre",{"className":379,"code":380,"language":381,"meta":382,"style":382},"language-bash shiki shiki-themes vitesse-light vitesse-light","cd apps/web\nNODE_ENV=production node scripts/bench-prerender-render.mjs --sample 300 --seed 11\n","bash","",[31,384,385,398],{"__ignoreMap":382},[386,387,390,394],"span",{"class":388,"line":389},"line",1,[386,391,393],{"class":392},"sz8Xr","cd",[386,395,397],{"class":396},"sdGka"," apps/web\n",[386,399,401,405,409,412,416,419,423,427,430],{"class":388,"line":400},2,[386,402,404],{"class":403},"s4oTP","NODE_ENV",[386,406,408],{"class":407},"shFtX","=",[386,410,411],{"class":396},"production",[386,413,415],{"class":414},"senZ8"," node",[386,417,418],{"class":396}," scripts/bench-prerender-render.mjs",[386,420,422],{"class":421},"snbK4"," --sample",[386,424,426],{"class":425},"sM54T"," 300",[386,428,429],{"class":421}," --seed",[386,431,432],{"class":425}," 11\n",[14,434,435,436,439],{},"シードを固定してあるので、両方の機で同じ記事集合を引ける。\n",[31,437,438],{},"NODE_ENV=production"," を付け忘れるとVueがdevビルドで動き、2倍遅い数字が出る。\n付け忘れたときは警告を出させた。",[14,441,442],{},"Windowsの実測は、300本の初回描画で平均69.9ms、p50が65ms、p90が94msだった。\n同じ40本を5周させると27.8msまで落ちる。\nキャッシュとJITが効くので、比較は必ず初回描画で揃える。",[14,444,445,446,449],{},"CPUプロファイルの内訳は、SQLiteのクエリが19.8%（1記事あたり約6ms）、記事ページのコードが12.3%、vue-routerが9.7%と続いた。\nリクエストごとに全ページぶんのルートを組み立て直しているのが9.7%の中身である。\nGCは4.7%だった。\n",[31,447,448],{},"--max-semi-space-size"," を64にすると69.9msが66.3msになり、128では変わらなかった。\nGCの調整では決着しない。",[21,451,453],{"id":452},"残りの5倍が何なのかはまだ言えない","残りの5倍が何なのかは、まだ言えない",[14,455,456],{},"Windowsの素の1記事SSRが70msだと分かった。\n足りないのはMac側の同じ数字である。",[14,458,459],{},"Macが15msなら、残る5倍はJS実行速度そのもので、設定では詰められない。\n35msなら差の半分は別の要因になり、64並列下のメモリ圧を疑う余地が残る。\n翌日期限でMac側の計測タスクを登録して、この日はここで止めた。",[21,461,463],{"id":462},"ログに並んでいた-fatal-50件の正体","ログに並んでいた fatal 50件の正体",[14,465,466,467,470],{},"run1のログに並んでいた ",[31,468,469],{},"[fatal]"," 50件は、速度とは別の話だった。\n30件は決算ページが相互リンクを無条件に張っていたせいで、JSONの無い30銘柄でリンク切れになっていた。\n残り20件はdev限定ページが本番で404を返す仕様どおりの出力で、こちらはノイズである。",[14,472,473],{},"判定関数を足してリンクを条件付きにさせ、テストを4件書かせた。\ndevのSSRを叩かせて、JSONのある銘柄ではリンクが1件、無い銘柄では0件になることまで確認した。",[14,475,476],{},"run1が終了コード1で落ちていた理由も判明した。\n別セッションがgenerateの実行中に記事を1本足していた。\nその記事はビルドがcontentを読んだ時点には無く、末尾の検証の時点にはあった。\n記事のコミット時刻はrun1終了の7分後だった。\ngenerate中にcontentを触るセッションがあると再現する、というだけの話である。",[21,478,480],{"id":479},"積み残しをディスクとapiで確かめる","積み残しをディスクとAPIで確かめる",[14,482,483],{},"セッションの締めに、積み残しが無いかとタスク管理が更新済みかを聞かれた。\n記憶で答えず、実物を見させた。",[14,485,486],{},"計画書に、run1で実測済みなのに未チェックのまま残っていた項目が3つ見つかった。\nその場で閉じさせて、タスクのほうはAPIで取り直して更新済みを確認した。\nコミットは3件に分けてpushさせた（学習ゲートはスキップ指定）。",[21,488,490],{"id":489},"夕方-全リポジトリのプッシュ漏れを洗う","夕方: 全リポジトリのプッシュ漏れを洗う",[14,492,493],{},"別件で、git_repo直下のリポジトリを全部見てプッシュ漏れを潰す作業も投げた。\n走査対象は約170リポジトリ、直近1か月に活動があったのは34、そのうち未反映が18あった。\nこれを52コミットに分けてpushさせた。",[14,495,496],{},"粒度だけ注文して、分け方は任せた。\n機能追加とメモ更新が混ざっているリポジトリでは2件に、変更の種類が4種類あるものは4件に割れて上がってきた。\n判断が要ったのは、未コミットのまま放置されていたファイルの扱いである。\nファイルの最終更新日を見させて、今月の変更と何か月も前のゴミを分けさせた。\n37MBぶんのランタイムログのように、そもそも追跡させたくないものも混ざっていた。",[14,498,499],{},"別のセッションが動いている2リポジトリには触らせず、状態の報告だけに留めさせた。",[21,501,502],{"id":502},"認証情報が消えた",[14,504,505,506,509],{},"最後の1リポジトリで止まった。\noriginのURLに古い認証情報が ",[31,507,508],{},"https://ユーザー名@github.com/..."," の形で埋め込まれていた。\nそれに気づかないままfetchして、401が返った。\ngitは401を受けると資格情報ヘルパーに削除を投げる。\nCredential Managerに保存してあったGitHubの資格情報は、そのタイミングで消えていた。\n消したのがこの削除だという確証まではないが、順序としては合う。",[14,511,512,513,516,517,520],{},"以後、全リポジトリでpushとfetchがGUIログインを待って止まるようになった。\n",[31,514,515],{},"gh auth status"," は正常でトークンも生きているのに、gitからは見えない。\nその場はコマンド単位で ",[31,518,519],{},"gh"," をヘルパーに指定して通し、作業自体は完遂させた。",[14,522,523,524,527],{},"恒久的な復旧には、こちらが一度ブラウザで再ログインする操作が要る。\n今日はそこまでやっていないので、issueに未解決で残した。\nリモートURLに ",[31,525,526],{},"ユーザー名@"," が埋まっているリポジトリでhttps操作をしない、というのが教訓になった。",[21,529,530],{"id":530},"明日以降に残っていること",[532,533,536,547,556,562],"ul",{"className":534},[535],"contains-task-list",[537,538,541,546],"li",{"className":539},[540],"task-list-item",[542,543],"input",{"disabled":544,"type":545},true,"checkbox"," Macで同じハーネスを打って、1記事あたりのSSR時間を並べる",[537,548,550,552,553,555],{"className":549},[540],[542,551],{"disabled":544,"type":545}," 次のgenerateで ",[31,554,469],{}," が20件（dev限定ページのみ）に減っているか確認する",[537,557,559,561],{"className":558},[540],[542,560],{"disabled":544,"type":545}," Credential Managerに資格情報を入れ直す",[537,563,565,567],{"className":564},[540],[542,566],{"disabled":544,"type":545}," 記事SSRの2割を占めるSQLiteのコネクタを差し替えた場合の差を測る",[569,570,571],"style",{},"html pre.shiki code .sz8Xr, html code.shiki .sz8Xr{--shiki-default:#998418;--shiki-dark:#998418}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .s4oTP, html code.shiki .s4oTP{--shiki-default:#B07D48;--shiki-dark:#B07D48}html pre.shiki code .shFtX, html code.shiki .shFtX{--shiki-default:#999999;--shiki-dark:#999999}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":382,"searchDepth":400,"depth":400,"links":573},[574,575,576,577,578,579,580,581,582,583,584],{"id":23,"depth":400,"text":23},{"id":55,"depth":400,"text":55},{"id":211,"depth":400,"text":212},{"id":354,"depth":400,"text":354},{"id":367,"depth":400,"text":368},{"id":452,"depth":400,"text":453},{"id":462,"depth":400,"text":463},{"id":479,"depth":400,"text":480},{"id":489,"depth":400,"text":490},{"id":502,"depth":400,"text":502},{"id":530,"depth":400,"text":530},"dev",null,"Defenderの除外だけを変えてpnpm generateを測り直したら21分44秒が11分30秒になった。効いたのはファイルを大量に開く処理で、記事のSSRはMacとの5倍差が残った。夕方は全リポジトリのプッシュ漏れを洗って認証情報を飛ばした","md",{},"/deploy-speed-defender-and-repo-push-audit","mdx-playground",false,"2026-08-19T00:00:00.000Z",{"title":5,"description":587},"make-diary","2026-08/2026-08-19/deploy-speed-defender-and-repo-push-audit",[598,599,133,600,601],"Windows Defender","Nuxt","ビルド高速化","Git","Nd10kfzYDtXSg3iqbPEYvwNnOPggLMMqiEz_c9lJwNE",[],[605,609,613,617,620],{"title":606,"path":607,"publishedAt":608},"デプロイ21分44秒の半分はDefender、残る5倍差はCPUのJS実行速度だった","/deploy-speed-defender-and-cpu-verdict","2026-08-20T00:00:00.000Z",{"title":610,"path":611,"publishedAt":612},"NuxtのSSGビルドが3倍遅くなった原因調査 — 差分ビルドではなくプリレンダー共有キャッシュで立て直す","/ssg-prerender-fullscan-cache","2026-07-19T00:00:00.000Z",{"title":614,"path":615,"publishedAt":616},"不動産登記簿の実例ページを dev 限定で実装し、git 履歴から個人データを浄化した日","/tokibo-jitsurei-private-data-and-svg-timeline","2026-06-13T00:00:00.000Z",{"title":618,"path":619,"publishedAt":593},"Chrome拡張のクリック領域が行全体に広がるバグと、__pycache__ で拡張が無効化される罠","/chrome-extension-click-area-and-pycache",{"title":621,"path":622,"publishedAt":623},"縦型ショート動画のレイアウトを専用実装せず、既存のレスポンシブ縦積みで撮った","/vertical-short-video-layout","2026-08-18T00:00:00.000Z","https://log.eurekapu.com/og/blog/deploy-speed-defender-and-repo-push-audit.png?v=2026-08-19T00%3A00%3A00.000Z&title=Windows%20Defender%E3%81%AE%E9%99%A4%E5%A4%96%E3%81%A7Nuxt%E3%81%AE%E3%83%93%E3%83%AB%E3%83%89%E3%81%AF%E5%8D%8A%E5%88%86%E3%81%AB%E3%81%AA%E3%81%A3%E3%81%9F%E3%81%8C%E3%80%81%E8%A8%98%E4%BA%8B%E3%81%AE%E3%83%97%E3%83%AA%E3%83%AC%E3%83%B3%E3%83%80%E3%83%BC%E3%81%AF16%25%E3%81%97%E3%81%8B%E7%B8%AE%E3%81%BE%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F&author=Kei%20Komatsu&sig=4d270dfc843cf716",1787187401100]