如何更好地诊断哪个客户端导致Xorg CPU使用率高?

时间:2018-09-06 10:25:32

标签: linux performance ubuntu debugging xorg

我遇到的问题是 Xorg服务器突然变得非常慢,并且其CPU使用率达到了100%。对此进行谷歌搜索,发现此问题的“最新技术”调试方法是开始随机杀死X个客户端,直到问题消失为止,然后您知道哪个客户端是有问题的客户端(祝您好运,在杀死该客户端后尝试对其进行调试) 。 X客户端中没有一个占用大量CPU(每个CPU最多占用1%左右)。而且系统仍然有2GB的可用RAM。

有人知道一种可以更好地诊断问题的方法吗?基本上,我正在寻找top替代Xorg,它将直接指向导致大多数CPU使用率的客户端进程。 Xorg。我已经知道xrestop与Xorg内存使用情况相同,但是这个问题专门涉及CPU使用情况。

造成此速度下降的另一个原因可能是GPU内存不足,这可能会导致通过PCI-express总线推送位图,而不是直接从GPU内存进行渲染。如果这显示为内核级别的CPU使用率(例如top),则可能是我遇到的问题,但我想更好地理解原因。当我从有问题的系统中编写此代码时,似乎最慢的情况发生在输入处理或字体渲染中,但我不知道如何更好地诊断问题。

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

如果我为有问题的客户端获得了PID甚至窗口句柄,那么找出根本原因会更容易(例如https://unix.stackexchange.com/q/5478)。而且我也不需要消磨行为良好的过程。

1 个答案:

答案 0 :(得分: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)找出真正的原因。问题。