当我在 vim 中工作时,(经常)会冻结一两秒......之后它恢复正常,执行冻结时我输入的所有内容
我在两台不同的 Ubuntu 机器上看到了这种行为,其中一台是全新安装后的。没有额外的插件,也没有花哨的配置。
任何想法?
答案1
确保自动阅读功能被禁用。这可能会导致类似于您所描述的短暂冻结。
您还可以将 .swp 文件放在不同的目录中,而不是正在编辑该文件的目录中。在 vim 中打开文件后但在进行任何编辑之前,执行
:set dir=/tmp
:vi
如果这有效,您可以通过将其添加到您的默认 .swp 文件位置~/.vimrc
set dir=/tmp
答案2
对我来说,当 vim 调用 fsync 以确保写入磁盘的数据不会被缓存以避免数据丢失时,就会发生冻结。改善情况的选择:
- 购买延迟更低的更好的高清。
- 修复 vim 以使用异步 IO 或 IO 线程来隐藏延迟
不知道你的问题是不是fsync的问题。你可以尝试用ftrace检查一下。
记录跟踪:
跑步:
sudo trace-cmd record -e syscalls:* -f "common_pid==<pid of vim>" \ -e sched:sched_switch -e sched:sched_wakeup -s 1000000
- 重现冻结
- 使用 Ctrl-c 停止录制
分析:
跑步:
trace-cmd report -F "syscalls : common_pid == <pid of vim>" | sed 's/://' \ | awk '{time = 0; if ($4 == "sys_exit:") time=$3-prev_time; prev_time=$3; \ printf "%6.6f %6.6f %s %s %s %s %s\n", time, $3, $4, $5, $6, $7, $8}' \ | sort -n
- 从列表中可以看出,除了 select 或 poll 之外的任何系统调用都很短。您可以使用“kernelshark”gui 检查有问题的系统调用期间发生的情况。 awk 输出中的第二列是与跟踪中系统调用结尾匹配的时间戳。
您的内核需要使用 CONFIG_FTRACE_SYSCALLS 进行编译。 Ubuntu 已启用该功能,但其他一些发行版可能会缺少该功能。