VSCode: Difference between revisions

From T2B Wiki
Jump to navigation Jump to search
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.
  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.
  <code>~/.vscode-server/data/Machine/settings.json</code>. Existing files are
* 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?''
  '''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 ==
== 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.
  <code>.vscode/settings.json</code> at the root of your project and paste the
* '''Your account on one machine (overrides / complements the baseline):''' Command Palette → Preferences: Open Remote Settings (SSH: mX) → switch to the JSON editor.
  settings there. It only affects that project.
* '''Baseline (managed by admins, do not delete):''' <code>~/.vscode-server/data/Machine/settings.json</code>
* '''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>


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.
  — stops the background file watcher from polluting cache/dependency folders,
* '''<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.
  or restricts it to the few directories you edit. This alone removes the
* '''<code>npm/task auto-detect off</code>''' — removes the recursive package.json search.
  majority of requests from a typical session.
* '''<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.
  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>git.autorefresh:false</code>''' — avoids background stat() storms
  on large repos.


== 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.
  work (search, indexing, big git operations) on a ''local scratch copy'' of
* For very large source trees, work on local scratch entirely and treat /user as the results area only.
  the project under /tmp, copying results back when done.
* 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
  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.

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.json 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): ~/.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:false removes 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.