VSCode

From T2B Wiki
Revision as of 09:19, 3 September 2026 by Admin (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

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.