vscode ssh-remote 疑似内存泄漏问题

vscode ssh-remote疑似内存泄漏问题

系统信息与版本号

版本:1.88.1(通用)

日期:2024-04-10T17:42:52.765Z

Electron: 28.2.8

ElectronBuildId: 27744544

Chromium:120.0.6099.291

Node.js:18.18.2

V8:12.0.267.19-electron.0

操作系统:Darwin x64 23.4.0

问题描述

vscodessh-remote 插件连接之后,会发现内存不断上涨,然后导致云主机崩溃。ubantu22.04与debian等系统均有这种情况。

疑似出现了内存泄漏,经过仔细检查发现vscode-server这个进程会不断添加新的进程进去,问题复现步骤:

  1. 使用 TypeScript 文件打开远程工作区
  2. 等待"正在初始化 JS/TS 语言功能"状态栏指示器停止出现。
  3. 运行此脚本以获取 ionotify 观察程序进程列表:脚本
  4. 请注意命令类似于 ~/.vscode-server/cli/servers/Stable-e170252f762678dec6ca2cc69aba1570769a5d39/server/node 的进程数量
  5. 重新加载窗口
  6. 重复步骤 2 到 4,你会发现步骤 4 中记下的数字比上次增加了。

脚本

shell 复制代码
#!/bin/bash

# Get the procs sorted by the number of inotify watches
# @author Carl-Erik Kopseng
# @latest https://github.com/fatso83/dotfiles/blob/master/utils/scripts/inotify-consumers
# Discussion leading up to answer: https://unix.stackexchange.com/questions/15509/whos-consuming-my-inotify-resources
#
# If you need ultimate speed, use https://github.com/fatso83/dotfiles/commit/inotify-consumers-v1-fastest
# # Speed enhancements by Simon Matter <simon.matter@invoca.ch>
#
# A later PR introduced a significant slowdown to gain better output, but it is insignificant on most machines
# See this for details: https://github.com/fatso83/dotfiles/pull/10#issuecomment-1122374716

main(){
    # get terminal width
    declare -i COLS=$(tput cols 2>/dev/null || echo 80)
    declare -i WLEN=10

    printf "\n%${WLEN}s  %${WLEN}s\n" "INOTIFY" "INSTANCES"
    printf "%${WLEN}s  %${WLEN}s\n" "WATCHES" "PER   "
    printf "%${WLEN}s  %${WLEN}s  %s\n" " COUNT " "PROCESS "    "PID USER         COMMAND"
    printf -- "------------------------------------------------------------\n"
    generateData
}

usage(){
    cat << EOF
Usage: $0 [--help|--limits]
    -l, --limits    Will print the current related limits and how to change them
    -h, --help      Show this help
EOF
}

limits(){
    printf "\nCurrent limits\n-------------\n"
    sysctl fs.inotify.max_user_instances fs.inotify.max_user_watches

    cat <<- EOF
Changing settings permanently
-----------------------------
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # re-read config
EOF
}

if [ "$1" = "--limits" -o "$1" = "-l" ]; then
    limits
    exit 0
fi

if [ "$1" = "--help" -o "$1" = "-h" ]; then
    usage
    exit 0
fi

if [ -n "$1" ]; then
    printf "\nUnknown parameter '$1'\n" >&2
    usage
    exit 1
fi

generateData(){
    local -i PROC
    local -i PID
    local -i CNT
    local -i INSTANCES
    local -i TOT
    local -i TOTINSTANCES
    # read process list into cache
    local PSLIST="$(ps ax -o pid,user=WIDE-COLUMN,command --columns $(( COLS - WLEN )))"
    local INOTIFY="$(find /proc/[0-9]*/fdinfo -type f 2>/dev/null | xargs grep ^inotify 2>/dev/null)"
    local INOTIFYCNT="$(echo "$INOTIFY" | cut -d "/" -s --output-delimiter=" "  -f 3 |uniq -c | sed -e 's/:.*//')"
    # unique instances per process is denoted by number of inotify FDs
    local INOTIFYINSTANCES="$(echo "$INOTIFY" | cut -d "/" -s --output-delimiter=" "   -f 3,5 | sed -e 's/:.*//'| uniq |awk '{print $1}' |uniq -c)"
    local INOTIFYUSERINSTANCES="$(echo "$INOTIFY" | cut -d "/" -s --output-delimiter=" "   -f 3,5 | sed -e 's/:.*//' | uniq |
    	     while read PID FD; do echo $PID $FD $(grep -e "^\ *${PID}\ " <<< "$PSLIST"|awk '{print $2}'); done | cut -d" "  -f 3 | sort | uniq -c |sort -nr)"
    set -e

    cat <<< "$INOTIFYCNT" |
        {
            while read -rs CNT PROC; do   # count watches of processes found
                echo "${PROC},${CNT},$(echo "$INOTIFYINSTANCES" | grep " ${PROC}$" |awk '{print $1}')"
            done
        } |
        grep -v ",0," |                  # remove entires without watches
        sort -n -t "," -k 2,3 -r |         # sort to begin with highest numbers
        {                                # group commands so that $TOT is visible in the printf
	    IFS=","
            while read -rs PID CNT INSTANCES; do   # show watches and corresponding process info
                printf "%$(( WLEN - 2 ))d  %$(( WLEN - 2 ))d     %s\n" "$CNT" "$INSTANCES" "$(grep -e "^\ *${PID}\ " <<< "$PSLIST")"
                TOT=$(( TOT + CNT ))
		TOTINSTANCES=$(( TOTINSTANCES + INSTANCES))
            done
	    # These stats should be per-user as well, since inotify limits are per-user..
            printf "\n%$(( WLEN - 2 ))d  %s\n" "$TOT" "WATCHES TOTAL COUNT"
# the total across different users is somewhat meaningless, not printing for now.
#            printf "\n%$(( WLEN - 2 ))d  %s\n" "$TOTINSTANCES" "TOTAL INSTANCES COUNT"
        }
    echo ""
    echo "INotify instances per user (e.g. limits specified by fs.inotify.max_user_instances): "
    echo ""
    (
      echo "INSTANCES    USER"
      echo "-----------  ------------------"
      echo "$INOTIFYUSERINSTANCES"
    ) | column -t
    echo ""

}

main

原问题网址

简单来描述这个问题,就是每次使用ssh-remote连接之后,会出现一个问题:

~/.vscode-server/cli/servers/Stable-...这个进程的数量增加了

当你关闭连接后,这个进程不会消失,但是下一次打开连接后,会产生新的进程,这样的结果就是导致进程数量不断增加导致占用的内存越来越多,最后导致系统崩溃重启。

修复方式

vscode 更新到预发布版本,开发者已经在最新的预发布版本中解决了这个问题。

相关推荐
Cachel wood2 小时前
Github配置ssh key原理及操作步骤
运维·开发语言·数据库·windows·postgresql·ssh·github
XMYX-09 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
小灰灰__14 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
Mortal_hhh15 小时前
VScode的C/C++点击转到定义,不是跳转定义而是跳转声明怎么办?(内附详细做法)
ide·vscode·stm32·编辑器
无极程序员15 小时前
PHP常量
android·ide·android studio
小黄人软件18 小时前
android浏览器源码 可输入地址或关键词搜索 android studio 2024 可开发可改地址
android·ide·android studio
Amelio_Ming21 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
叶知安21 小时前
如何用pycharm连接sagemath?
ide·python·pycharm
电子云与长程纠缠1 天前
UE5.3中通过编辑器工具创建大纲菜单文件夹
java·ue5·编辑器