Vim 短暂冻结

Vim 短暂冻结

当我在 vim 中工作时,(经常)会冻结一两秒......之后它恢复正常,执行冻结时我输入的所有内容

我在两台不同的 Ubuntu 机器上看到了这种行为,其中一台是全新安装后的。没有额外的插件,也没有花哨的配置。

任何想法?

答案1

确保自动阅读功能被禁用。这可能会导致类似于您所描述的短暂冻结。

您还可以将 .swp 文件放在不同的目录中,而不是正在编辑该文件的目录中。在 vim 中打开文件后但在进行任何编辑之前,执行

:set dir=/tmp
:vi

如果这有效,您可以通过将其添加到您的默认 .swp 文件位置~/.vimrc

set dir=/tmp

答案2

对我来说,当 vim 调用 fsync 以确保写入磁盘的数据不会被缓存以避免数据丢失时,就会发生冻结。改善情况的选择:

  • 购买延迟更低的更好的高清。
  • 修复 vim 以使用异步 IO 或 IO 线程来隐藏延迟

不知道你的问题是不是fsync的问题。你可以尝试用ftrace检查一下。

记录跟踪:

  1. 跑步:

    sudo trace-cmd record -e syscalls:* -f "common_pid==<pid of vim>" \
      -e sched:sched_switch -e sched:sched_wakeup -s 1000000
    
  2. 重现冻结
  3. 使用 Ctrl-c 停止录制

分析:

  1. 跑步:

    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
    
  2. 从列表中可以看出,除了 select 或 poll 之外的任何系统调用都很短。您可以使用“kernelshark”gui 检查有问题的系统调用期间发生的情况。 awk 输出中的第二列是与跟踪中系统调用结尾匹配的时间戳。

您的内核需要使用 CONFIG_FTRACE_SYSCALLS 进行编译。 Ubuntu 已启用该功能,但其他一些发行版可能会缺少该功能。

相关内容