)]}'
{
  "commit": "018bad7658017c397b47964f6cde71cab37ed6b1",
  "tree": "77a95e087af535c0cb9e8c161fbb69821e8f10ca",
  "parents": [
    "cfcd774b98f3433e18b722f9a7ff06119825b8eb"
  ],
  "author": {
    "name": "Takuto Ikuta",
    "email": "tikuta@google.com",
    "time": "Mon Sep 14 16:53:50 2026 +0900"
  },
  "committer": {
    "name": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "email": "gn-scoped@luci-project-accounts.iam.gserviceaccount.com",
    "time": "Mon Sep 14 01:09:34 2026 -0700"
  },
  "message": "[recipe] Enable THP for jemalloc build in GN recipe\n\nConfigure jemalloc with --with-malloc-conf\u003dthp:always to enable\nTransparent Huge Pages (THP) by default on Linux.\n\nWhen running large GN generation tasks (such as Chromium\u0027s gn gen),\njemalloc allocates extensive virtual memory ranges. Without THP enabled\nby default, allocations rely heavily on 4KB pages, leading to\nsignificant kernel overhead in page fault handling and page table walks\n(minor page faults: ~467k).\n\nBy enabling thp:always, jemalloc proactively uses 2MB huge pages via\nmadvise(MADV_HUGEPAGE), reducing minor page faults by 54% and improving\nwall clock time by ~218ms (~6.7%).\n\nBenchmark (`hyperfine --warmup 2 --runs 10` on Chromium `gn gen`):\n- jemalloc (default):       3.236 s ± 0.028 s\n- jemalloc (thp:always):    3.018 s ± 0.052 s  (-218 ms, 1.07x faster)\n\nperf stat comparison:\n- Minor faults:  467,490 -\u003e 215,229 (-54.0%)\n- CPU cycles:    104.9G  -\u003e 98.2G   (-6.7B cycles)\n- User CPU time: 26.54s  -\u003e 23.92s  (-2.62s)\n- Sys CPU time:  17.51s  -\u003e 15.62s  (-1.89s)\n\nTAG\u003dagy\nCONV\u003d4cb5d931-60a8-4f44-8632-3e8d9fb10a8d\nChange-Id: I134509479c0cf74c397cea8c8227d911e2734963\nReviewed-on: https://gn-review.googlesource.com/c/gn/+/26460\nCommit-Queue: David Turner \u003cdigit@google.com\u003e\nReviewed-by: David Turner \u003cdigit@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "3a98040e63086a75ec02900e455bfff2b52eb3df",
      "old_mode": 33188,
      "old_path": "infra/recipes/gn.expected/ci_linux.json",
      "new_id": "bc50b1a1554069ba4707db3e3dc984fbfc4a813e",
      "new_mode": 33188,
      "new_path": "infra/recipes/gn.expected/ci_linux.json"
    },
    {
      "type": "modify",
      "old_id": "9a363f0192d6792359ec62c77e2d20eb4904da45",
      "old_mode": 33188,
      "old_path": "infra/recipes/gn.expected/cipd_exists.json",
      "new_id": "b236cb813985ab0132c74ca34fde447b1c400625",
      "new_mode": 33188,
      "new_path": "infra/recipes/gn.expected/cipd_exists.json"
    },
    {
      "type": "modify",
      "old_id": "76cdb0f107c20a553ba1af5be093c9f5e6dab366",
      "old_mode": 33188,
      "old_path": "infra/recipes/gn.expected/cipd_register.json",
      "new_id": "e018c44e2998f91648112a051d361c3dbbdcedc2",
      "new_mode": 33188,
      "new_path": "infra/recipes/gn.expected/cipd_register.json"
    },
    {
      "type": "modify",
      "old_id": "91282cc4b2e1ccbfc4c6f5016d4822ce764f5f4b",
      "old_mode": 33188,
      "old_path": "infra/recipes/gn.expected/cq_linux.json",
      "new_id": "5c815f5a6fa815a6b4b30da1e5f290e094339c45",
      "new_mode": 33188,
      "new_path": "infra/recipes/gn.expected/cq_linux.json"
    },
    {
      "type": "modify",
      "old_id": "28039e946f28ab2f986a0ea678a545634d00a5e0",
      "old_mode": 33188,
      "old_path": "infra/recipes/gn.py",
      "new_id": "a5cd4e6e043995dc8f02f7b1b54e7bcf75c04dd4",
      "new_mode": 33188,
      "new_path": "infra/recipes/gn.py"
    }
  ]
}
