Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Track use cache usage #75007

Merged
merged 3 commits into from
Jan 22, 2025
Merged

Track use cache usage #75007

merged 3 commits into from
Jan 22, 2025

Conversation

gaojude
Copy link
Contributor

@gaojude gaojude commented Jan 16, 2025

We’re updating the SWC transform to track how the "use cache" directive is used during builds. Each use of "use cache" is counted based on the handler it’s linked to.

By default, "use cache" counts toward a feature called "useCache/default". If a custom handler is defined in the Next.js config (e.g., "custom"), then "use cache: custom" will count toward "useCache/custom".

The build process will collect these counts and combine them across all source files and workers. This data is reported under the NEXT_BUILD_FEATURE_USAGE event, allowing us to filter by "useCache/*" to see how often each cache handler is used.

*Only support webpack prod build for now.

Closes NDX-683

@ijjk ijjk added created-by: Next.js team PRs by the Next.js team. Turbopack Related to Turbopack with Next.js. type: next labels Jan 16, 2025
@gaojude gaojude changed the title track use cacheu usage track use cache usage Jan 16, 2025
Copy link
Contributor Author

gaojude commented Jan 16, 2025

This stack of pull requests is managed by Graphite. Learn more about stacking.

@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from c8ddb3f to f278e64 Compare January 17, 2025 22:37
@gaojude gaojude changed the title track use cache usage Track use cache usage Jan 17, 2025
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from f278e64 to bec67bb Compare January 17, 2025 22:40
@ijjk ijjk added the tests label Jan 17, 2025
@gaojude gaojude marked this pull request as ready for review January 17, 2025 22:46
@ijjk
Copy link
Member

ijjk commented Jan 17, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
buildDuration 19.5s 16.2s N/A
buildDurationCached 15.2s 13s N/A
nodeModulesSize 418 MB 418 MB ⚠️ +45 kB
nextStartRea..uration (ms) 420ms 423ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
5306-HASH.js gzip 54 kB 54 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.46 kB 5.46 kB N/A
bccd1874-HASH.js gzip 52.9 kB 52.9 kB
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 240 B 242 B N/A
main-HASH.js gzip 34.6 kB 34.6 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 52.9 kB 52.9 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.59 kB 4.58 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.35 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
_buildManifest.js gzip 748 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
index.html gzip 524 B 523 B N/A
link.html gzip 540 B 538 B N/A
withRouter.html gzip 520 B 520 B
Overall change 520 B 520 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
edge-ssr.js gzip 129 kB 129 kB N/A
page.js gzip 208 kB 208 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
middleware-b..fest.js gzip 670 B 665 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.3 kB 31.3 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
274-experime...dev.js gzip 322 B 322 B
274.runtime.dev.js gzip 314 B 314 B
app-page-exp...dev.js gzip 375 kB 375 kB
app-page-exp..prod.js gzip 130 kB 130 kB
app-page-tur..prod.js gzip 143 kB 143 kB
app-page-tur..prod.js gzip 139 kB 139 kB
app-page.run...dev.js gzip 363 kB 363 kB
app-page.run..prod.js gzip 126 kB 126 kB
app-route-ex...dev.js gzip 37.6 kB 37.6 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 39.2 kB 39.2 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.6 kB 11.6 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.9 kB 21.9 kB
pages.runtim...dev.js gzip 27.7 kB 27.7 kB
pages.runtim..prod.js gzip 21.9 kB 21.9 kB
server.runti..prod.js gzip 916 kB 916 kB
Overall change 2.47 MB 2.47 MB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js jude/use-cache-tracking-2 Change
0.pack gzip 2.1 MB 2.11 MB ⚠️ +7.34 kB
index.pack gzip 75.6 kB 74.8 kB N/A
Overall change 2.1 MB 2.11 MB ⚠️ +7.34 kB
Diff details
Diff for main-HASH.js

Diff too large to display

Commit: a17d90e

@gaojude gaojude requested a review from ijjk January 17, 2025 22:56
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from bec67bb to 6b903da Compare January 17, 2025 22:57
@vercel vercel deleted a comment from ijjk Jan 17, 2025
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from 6b903da to 7674ab8 Compare January 18, 2025 00:26
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch 3 times, most recently from 4fcd809 to 31f7de5 Compare January 20, 2025 16:28
@vercel vercel deleted a comment from ijjk Jan 20, 2025
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from 7e8234c to 9ca84f6 Compare January 20, 2025 20:29
@ijjk
Copy link
Member

ijjk commented Jan 20, 2025

Tests Passed

@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from 9ca84f6 to ee90c48 Compare January 20, 2025 20:53
@gaojude gaojude requested review from ijjk and ztanner January 20, 2025 22:02
for (const key in tracker2) {
if (Object.prototype.hasOwnProperty.call(tracker2, key)) {
const typedKey = key as UseCacheTrackerKey
if (mergedTracker[typedKey] !== undefined) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If a component/file that uses use cache is imported in both a nodejs page and a edge page will it be counted twice one from each compilation?

Copy link
Contributor Author

@gaojude gaojude Jan 22, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use cache requires dynamicIO, but I saw the error that "runtime" is not compatible with nextConfig.experimental.dynamicIO. so I assume we don't support edge runtime for use cache components anymore. Hence, it should not run into this double-counting issue.

To reassure this is the case, #75007 (comment)

@gaojude gaojude requested a review from ijjk January 22, 2025 15:12
@gaojude gaojude force-pushed the jude/use-cache-tracking-2 branch from be11323 to a17d90e Compare January 22, 2025 15:14
@@ -1937,6 +1939,11 @@ export default async function getBaseWebpackConfig(
].filter<[Feature, boolean]>(Boolean as any)
)
),
!dev &&
isNodeServer &&
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ijjk to avoid double counting in general, I added this check here to skip tracking edge stuff.

@gaojude gaojude merged commit 07d2820 into canary Jan 22, 2025
131 checks passed
@gaojude gaojude deleted the jude/use-cache-tracking-2 branch January 22, 2025 16:41
bgw added a commit that referenced this pull request Feb 4, 2025
…usage with `Rc<RefCell<FxHashMap<_, _>>>` (#75534)

This is a follow-up to #75007

`DashMap` is needed for situations where you have many threads (or tokio tasks) modifying the same data at the same time. It introduces a lot of memory and CPU overhead to create individually lockable `RwLock` shards. This type of data structure implements `Sync`, indicating that it can be shared between threads.

`Rc` is not `Sync` (`Arc` is `Sync`), so wrapping `DashMap` in `Rc` doesn't make a lot of sense: You're paying a pretty high overhead for the ability to share data between threads, and wrapping it in something that does not support sharing data between threads.

This visitor code is entirely single-threaded, so just use `Rc<RefCell<FxHashMap>>` instead. `RefCell` is a very cheap single-threaded version of a `Mutex`. `FxHashMap` is just a `HashMap` with the faster `FxHash` algorithm used.
@github-actions github-actions bot added the locked label Feb 6, 2025
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 6, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
created-by: Next.js team PRs by the Next.js team. locked tests Turbopack Related to Turbopack with Next.js. type: next
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants