VSCode: Difference between revisions
Created page with "= VS Code on the /user CephFS filesystem — reduce your metadata load = __TOC__ == Why this matters == The shared /user area is a CephFS filesystem served by a single metadata server (MDS). Ordinary editor operations (stat, ls, open, reading directory entries) turn into ''metadata requests'' that the MDS must serve for ''all'' users — on the login machines ''and'' on the worker nodes. A few VS Code features are notoriously chatty: * the ''file watcher'' polls watc..." |
No edit summary |
||
| Line 5: | Line 5: | ||
== Why this matters == | == Why this matters == | ||
The shared /user area is a CephFS filesystem served by a single metadata server | The shared /user area is a CephFS filesystem served by a single metadata server (MDS). Ordinary editor operations (stat, ls, open, reading directory entries) turn into ''metadata requests'' that the MDS must serve for ''all'' users — on the login machines ''and'' on the worker nodes. A few VS Code features are notoriously chatty: | ||
(MDS). Ordinary editor operations (stat, ls, open, reading directory entries) | |||
turn into ''metadata requests'' that the MDS must serve for ''all'' users — on | |||
the login machines ''and'' on the worker nodes. A few VS Code features are | |||
notoriously chatty: | |||
* the ''file watcher'' polls watched directories in the background; | * the ''file watcher'' polls watched directories in the background; | ||
* ''Pylance'' (the Python language server) indexes and scans the whole workspace; | * ''Pylance'' (the Python language server) indexes and scans the whole workspace; | ||
* the ''npm / task auto-detection'' runs a recursive search for package.json | * the ''npm / task auto-detection'' runs a recursive search for package.json files across the whole tree. | ||
When several people have such sessions open, the MDS saturates: simple | When several people have such sessions open, the MDS saturates: simple operations that should take ~10 ms take seconds, for everyone. This page tells you how to reduce your own contribution. | ||
operations that should take ~10 ms take seconds, for everyone. This page tells | |||
you how to reduce your own contribution. | |||
== Server-side baseline (admin-managed, janitor) == | == Server-side baseline (admin-managed, janitor) == | ||
The admins deploy a ''baseline'' of the settings below into every account on | The admins deploy a ''baseline'' of the settings below into every account on the mX login machines via a janitor script. Two things to know: | ||
the mX login machines via a janitor script. Two things to know: | |||
* It is injected only ''if your file does not exist yet'': | * It is injected only ''if your file does not exist yet'': <code>~/.vscode-server/data/Machine/settings.json</code>. Existing files are '''never''' overwritten, so anything you have already configured stays yours. | ||
* About 15 users currently already have their own file. For those, nothing is injected — see the section below: ''I already have a settings.json — what do I need to check?'' | |||
* About 15 users currently already have their own file. For those, nothing | |||
== Where to put the settings == | == Where to put the settings == | ||
* '''Recommended (per project, versioned):''' create a file | * '''Recommended (per project, versioned):''' create a file <code>.vscode/settings.json</code> at the root of your project and paste the settings there. It only affects that project. | ||
* '''Your account on one machine (overrides / complements the baseline):''' Command Palette → Preferences: Open Remote Settings (SSH: mX) → switch to the JSON editor. | |||
* '''Baseline (managed by admins, do not delete):''' <code>~/.vscode-server/data/Machine/settings.json</code> | |||
* '''Your account on one machine (overrides / complements the baseline):''' | |||
* '''Baseline (managed by admins, do not delete):''' | |||
After applying: Command Palette → Developer: Restart Extension Host. | After applying: Command Palette → Developer: Restart Extension Host. | ||
| Line 47: | Line 30: | ||
== Complete settings.json == | == Complete settings.json == | ||
The file below is commented and safe to paste as-is. Replace | The file below is commented and safe to paste as-is. Replace ''<your-username>'' and ''<project>'' with your own values where indicated. Settings in this file are pure JSON-with-comments (VS Code accepts them). | ||
''<your-username>'' and ''<project>'' with your own values where indicated. | |||
Settings in this file are pure JSON-with-comments (VS Code accepts them). | |||
<pre> | <pre> | ||
| Line 128: | Line 109: | ||
== I already have a settings.json — what do I need to check? == | == I already have a settings.json — what do I need to check? == | ||
If your account already had a <code>~/.vscode-server/data/Machine/settings.json</code> | If your account already had a <code>~/.vscode-server/data/Machine/settings.json</code> before the janitor went live, the baseline was '''not''' injected for you. Please open that file (or Preferences: Open Remote Settings) and make sure these keys are present. You can copy this minimal block and merge it into your existing file: | ||
before the janitor went live, the baseline was '''not''' injected for you. | |||
Please open that file (or Preferences: Open Remote Settings) and make sure | |||
these keys are present. You can copy this minimal block and merge it into your | |||
existing file: | |||
<pre> | <pre> | ||
| Line 153: | Line 130: | ||
</pre> | </pre> | ||
These are the keys that matter most. Everything else in the full example above | These are the keys that matter most. Everything else in the full example above is optional tuning. | ||
is optional tuning. | |||
== What each block does == | == What each block does == | ||
* '''<code>files.watcherExclude</code> / <code>files.watcherInclude</code>''' | * '''<code>files.watcherExclude</code> / <code>files.watcherInclude</code>''' — stops the background file watcher from polluting cache/dependency folders, or restricts it to the few directories you edit. This alone removes the majority of requests from a typical session. | ||
* '''<code>python.analysis.*</code>''' — Pylance walks the tree for imports and indexing. <code>openFilesOnly</code> + <code>indexing:false</code> removes nearly all of that traffic while keeping completion in the files you have open. | |||
* '''<code>npm/task auto-detect off</code>''' — removes the recursive package.json search. | |||
* '''<code>search.useIgnoreFiles</code>''' — searches stop descending into ignored dirs. | |||
* '''<code>python.analysis.*</code>''' — Pylance walks the tree for imports and | * '''<code>git.autorefresh:false</code>''' — avoids background stat() storms on large repos. | ||
* '''<code>npm/task auto-detect off</code>''' — removes the recursive | |||
* '''<code>search.useIgnoreFiles</code>''' — searches stop descending into | |||
* '''<code>git.autorefresh:false</code>''' — avoids background stat() storms | |||
== Still slow? The strongest options == | == Still slow? The strongest options == | ||
* Keep only a light VS Code window on /user (watchers excluded) and do heavy | * Keep only a light VS Code window on /user (watchers excluded) and do heavy work (search, indexing, big git operations) on a ''local scratch copy'' of the project under /tmp, copying results back when done. | ||
* For very large source trees, work on local scratch entirely and treat /user as the results area only. | |||
* Avoid opening your whole home directory (<code>/user/<your-username></code>) as the workspace root — open the specific project folder instead. | |||
* For very large source trees, work on local scratch entirely and treat /user | |||
* Avoid opening your whole home directory | |||
Latest revision as of 09:19, 3 September 2026
VS Code on the /user CephFS filesystem — reduce your metadata load
Why this matters
The shared /user area is a CephFS filesystem served by a single metadata server (MDS). Ordinary editor operations (stat, ls, open, reading directory entries) turn into metadata requests that the MDS must serve for all users — on the login machines and on the worker nodes. A few VS Code features are notoriously chatty:
- the file watcher polls watched directories in the background;
- Pylance (the Python language server) indexes and scans the whole workspace;
- the npm / task auto-detection runs a recursive search for package.json files across the whole tree.
When several people have such sessions open, the MDS saturates: simple operations that should take ~10 ms take seconds, for everyone. This page tells you how to reduce your own contribution.
Server-side baseline (admin-managed, janitor)
The admins deploy a baseline of the settings below into every account on the mX login machines via a janitor script. Two things to know:
- It is injected only if your file does not exist yet:
~/.vscode-server/data/Machine/settings.json. Existing files are never overwritten, so anything you have already configured stays yours. - About 15 users currently already have their own file. For those, nothing is injected — see the section below: I already have a settings.json — what do I need to check?
Where to put the settings
- Recommended (per project, versioned): create a file
.vscode/settings.jsonat the root of your project and paste the settings there. It only affects that project. - Your account on one machine (overrides / complements the baseline): Command Palette → Preferences: Open Remote Settings (SSH: mX) → switch to the JSON editor.
- Baseline (managed by admins, do not delete):
~/.vscode-server/data/Machine/settings.json
After applying: Command Palette → Developer: Restart Extension Host.
Complete settings.json
The file below is commented and safe to paste as-is. Replace <your-username> and <project> with your own values where indicated. Settings in this file are pure JSON-with-comments (VS Code accepts them).
{
// ---- 1. File watching (the single biggest source of metadata requests) ----
// Never watch generated, dependency or cache directories.
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/.git/subtree-cache/**": true,
"**/node_modules/**": true,
"**/__pycache__/**": true,
"**/.mypy_cache/**": true,
"**/.pytest_cache/**": true,
"**/.ruff_cache/**": true,
"**/.venv/**": true,
"**/.conda/**": true,
"**/*.egg-info/**": true,
"**/build/**": true,
"**/dist/**": true,
"**/htmlcov/**": true,
"**/.cache/**": true
},
// Optional: whitelist ONLY the directories you actually edit.
// Leave the array empty to keep the default (watch everything except the
// excludes above). If you fill it, only these paths are watched at all.
"files.watcherInclude": [
"/user/<your-username>/<project>/src"
],
// ---- 2. Pylance / Python language server ----
// "default" keeps basic IntelliSense; "none" disables it completely
// (cheapest option).
"python.languageServer": "default",
// Analyse only the files you have open, not the whole workspace.
"python.analysis.diagnosticMode": "openFilesOnly",
// No background workspace index.
"python.analysis.indexing": false,
// No automatic import searches across the tree.
"python.analysis.autoSearchPaths": false,
"python.analysis.autoImportCompletions": false,
"python.analysis.useLibraryCodeForTypes": false,
// ---- 3. npm / task auto-detection ----
// This is what launches the recursive `rg --files -g **/package.json`
// scans. Turn it off unless you actively use the NPM Scripts panel.
"npm.autoDetect": "off",
"task.autoDetect": "off",
"gulp.autoDetect": "off",
"grunt.autoDetect": "off",
"jake.autoDetect": "off",
// ---- 4. Search (Ctrl+Shift+F) ----
// Respect .gitignore so searches don't walk everything.
"search.useIgnoreFiles": true,
"search.useGlobalIgnoreFiles": true,
"search.exclude": {
"**/.git": true,
"**/node_modules": true,
"**/__pycache__": true,
"**/.venv": true,
"**/build": true,
"**/dist": true
},
// ---- 5. Git ----
// Don't re-stat the whole working tree in the background.
"git.autorefresh": false,
// Disable Git integration entirely for repositories you don't need it on.
"git.enabled": true,
// ---- 6. Editor / autosave ----
// Batch saves instead of writing on every keystroke.
"files.autoSave": "afterDelay",
"files.autoSaveDelay": 5000
}
I already have a settings.json — what do I need to check?
If your account already had a ~/.vscode-server/data/Machine/settings.json before the janitor went live, the baseline was not injected for you. Please open that file (or Preferences: Open Remote Settings) and make sure these keys are present. You can copy this minimal block and merge it into your existing file:
{
"files.watcherExclude": {
"**/.git/objects/**": true,
"**/node_modules/**": true,
"**/__pycache__/**": true,
"**/.venv/**": true,
"**/build/**": true,
"**/dist/**": true
},
"python.analysis.diagnosticMode": "openFilesOnly",
"python.analysis.indexing": false,
"npm.autoDetect": "off",
"task.autoDetect": "off",
"search.useIgnoreFiles": true,
"git.autorefresh": false
}
These are the keys that matter most. Everything else in the full example above is optional tuning.
What each block does
files.watcherExclude/files.watcherInclude— stops the background file watcher from polluting cache/dependency folders, or restricts it to the few directories you edit. This alone removes the majority of requests from a typical session.python.analysis.*— Pylance walks the tree for imports and indexing.openFilesOnly+indexing:falseremoves nearly all of that traffic while keeping completion in the files you have open.npm/task auto-detect off— removes the recursive package.json search.search.useIgnoreFiles— searches stop descending into ignored dirs.git.autorefresh:false— avoids background stat() storms on large repos.
Still slow? The strongest options
- Keep only a light VS Code window on /user (watchers excluded) and do heavy work (search, indexing, big git operations) on a local scratch copy of the project under /tmp, copying results back when done.
- For very large source trees, work on local scratch entirely and treat /user as the results area only.
- Avoid opening your whole home directory (
/user/<your-username>) as the workspace root — open the specific project folder instead.