【问题标题】:How to better diagnose which client is causing high Xorg CPU usage?如何更好地诊断哪个客户端导致高 Xorg CPU 使用率?
【发布时间】:2018-09-06 10:25:32
【问题描述】:

我遇到了问题,Xorg 服务器突然变得非常慢并且它的 CPU 使用率达到 100%。谷歌搜索表明这个问题的“最先进”调试方法是开始随机杀死 X 客户端,直到问题消失,然后你知道哪个客户端是有问题的客户端(祝你好运,在杀死它后尝试调试进程) .没有一个 X 客户端正在消耗大量 CPU(每个最多大约 1% 的 CPU)。而且系统还有 2GB 的可用 RAM。

有人知道更好地诊断问题的方法吗? 基本上我正在寻找 Xorg 的 top 替代品,这将直接指向导致 Xorg 占用 CPU 最多的客户端进程.我已经知道xrestop 这与 Xorg 内存使用情况相同,但这个问题专门针对 CPU 使用情况。

导致速度变慢的另一个原因可能是 GPU 内存不足,这可能会导致通过 PCI-express 总线推送位图,而不是直接从 GPU 内存渲染到显示器。如果这显示为内核级别的 CPU 使用率(例如top),这可能是我看到的问题,但我想更好地了解原因。当我从有问题的系统中写这篇文章时,似乎大多数减速都发生在输入处理或字体渲染中,但我不知道如何更好地诊断。

我知道可能使用另一台计算机并与ssh 连接,将gdb 进程附加到有问题的Xorg 服务器并开始挖掘,但我希望能更容易一些。

如果我得到问题客户端的 PID 甚至窗口句柄,找出根本原因会更容易(例如https://unix.stackexchange.com/q/5478)。而且我不需要杀死行为良好的进程作为副作用。

【问题讨论】:

  • 您可以在同一台机器上的不同虚拟控制台中的Xorg 上使用gdb
  • 打字时减速最为明显,因此我宁愿在尝试调试问题时将物理键盘连接到 Xorg。而且由于原因可能是对 Xorg 设置的多个小请求的结果,因此仅使用 gdb 可能很难找出原因。也许我需要 FlameGraph (brendangregg.com/FlameGraphs/cpuflamegraphs.html),但我没有适合当前运行的自定义内核映像的工具(即 perf)。
  • 您还可以尝试使用strace 或类似工具查找与X 服务器进行大量来回通信的客户端。例如,如果您有 10 个客户端进程,其中 9 个不经常与 X 服务器通信,但一个不断发送和接收大量小消息,我怀疑“健谈”客户端是罪魁祸首。

标签: linux performance ubuntu debugging xorg


【解决方案1】:

这是一个脚本,用于确定是否是某个客户端导致了问题(但对我的问题没有帮助):

#!/bin/bash

WINDOW_IDS=$(xwininfo -tree -root | grep -o -P '\b0x[0-9a-f]+' | sort -u)

PIDS=""
for ID in $WINDOW_IDS
do
    if [ "$ID" = "0x0" ]
    then
        continue
    fi
    #printf "Window %s PID=" "$ID" 
    PID=$(LC_ALL=C xprop -id "$ID" _NET_WM_PID | cut -d' ' -f3-)
    if [ "$PID" = "not found." ]
    then
    #   printf "%s\n" "(unknown)"
    #   See also: https://unix.stackexchange.com/a/84981
        true
    else
    #   printf "%s\n" "$PID"
        PIDS="$PIDS $PID"
    fi
done

PIDS=$(printf "%s\n" $PIDS | sort -u)

# go through the list of processes connected to Xorg:

for PID in $PIDS
do
    printf "%s: %s\n" "$PID" "$(cat /proc/$PID/cmdline)"
    sleep 0.1s # wait for the previous line to get on the screen before stopping e.g. compositing manager 
    # Stop the process for 5 secs and let the process continue after that.
    kill -STOP "$PID" && sleep 1s && kill -CONT "$PID"
done

这个想法是让每个客户端依次停止 5 秒,如果这能在 5 秒内解决问题,那么您就发现了问题。此脚本将SIGSTOP 发送到无法忽略的目标进程,并阻止目标进程获取 CPU 时间,因此它也无法向 Xorg 发送任何事件。请注意,如果您在中间终止此脚本,您最终可能会导致其中一个进程处于 STOPPED 状态。发送SIGCONT 解决问题。如果您等待脚本完成,一切都应该没问题。 (另见:https://unix.stackexchange.com/a/298650

就我而言,无论哪个客户端停止,Xorg 都会一直运行缓慢,所以我想我看到的问题是内部 Xorg 问题,我需要使用 FlameGraphs (http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html) 来找出真正的原因问题。

【讨论】:

  • 我将此答案标记为已接受的答案。从那以后我再也没有遇到过类似的问题,所以我猜这确实是 Xorg 中的一个错误,在以后的某个版本中得到了修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 2020-02-05
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多