Как узнать, какие процессы используют область подкачки в Linux?

После еще нескольких экспериментов с GStreamer и библиотекой RTSP-сервера ситуация с обработкой ошибок усложняется.

Нормальный способ

Канонический способ увидеть ошибки в конвейере GStreamer - добавить наблюдателя к шине конвейера и прослушивать сообщения об ошибках.

def watcher(bus, message, *user_data);
    if message.type == Gst.MessageType.ERROR:
        error, message = message.parse_error()
        # TODO: Do something with the error

my_pipeline.get_bus().add_watch(
    GLib.PRIORITY_DEFAULT,
    watcher,
    None)

Однако вы не можете сделать это с конвейерами, которые вы поставляете в GstRtspServer. Это связано с тем, что GstRtspServer ожидает установки собственного наблюдателя на шину конвейера, и только один наблюдатель может быть подключен к шине одновременно. Это особенно прискорбно, потому что это мешает нам слушать любые события в конвейере, а не только ошибки.

Мой обходной путь

Мы можем разделить конвейер на две части: одна отвечает за подверженный ошибкам процесс соединения с исходным и декодирующим кадрами, а другая отвечает за кодирование получаемых кадров. и загрузка их для GstRtspServer. Затем мы можем использовать плагин intervideo для связи между ними.

Например, допустим, вы пытаетесь выполнить потоковую передачу из файла в формате VP8. Наш первый конвейер, отвечающий за чтение и декодирование кадров, будет выглядеть следующим образом:

filesrc location="{filepath}" ! decodebin ! intervideosink channel="file-channel"

... а наш второй конвейер, который отвечает за кодирование и загрузку кадра, будет выглядеть так:

[ 112]

Ключевым моментом здесь является то, что GstRtspServer должен управлять только вторым конвейером, поскольку именно этот конвейер предоставляет полезные данные. Первый управляется нами, и мы можем прикрепить к нему нашего собственного наблюдателя, который разумно реагирует на ошибки и делает все остальное, что нам нужно. Конечно, это не идеальное решение, потому что мы не можем реагировать на ошибки, связанные с кодированием и полезной нагрузкой, но мы получили возможность получать ошибки, связанные с чтением файла и его декодированием. Теперь мы также можем выполнять другие задачи, связанные с сообщениями, например, перехватывать сообщение конца потока для зацикливания видеофайла.

232
задан Thorbjørn Ravn Andersen 30 January 2018 в 23:40
поделиться

4 ответа

Выполненный вершина затем нажатие O p Входят . Теперь процессы должны быть отсортированы по их использованию подкачки.

Вот обновление, поскольку мой исходный ответ не предоставляет точное решение проблемы, как указано в комментариях. От htop FAQ:

не возможно получить точный размер используемой области подкачки процесса. Вершина фальсифицирует эту информацию путем создания ПОДКАЧКИ = VIRT - RES, но это не хорошая метрика, потому что другой материал, такой как видеопамять рассчитывает на VIRT также (например: вершина говорит, что мои X процессов используют 81M подкачки, но это также сообщает, что моя система в целом использует только 2M подкачки. Поэтому я не добавлю подобный столбец Swap к htop, потому что я не знаю надежный способ получить эту информацию (на самом деле, я не думаю, что возможно получить точное число из-за поделившихся страниц).

102
ответ дан gvlasov 23 November 2019 в 03:34
поделиться

Я не знаю ни о каком прямом ответе как, как найти точно, какой процесс использует область подкачки, однако, эта ссылка может быть полезна . Другой, который хороший - здесь

кроме того, используют хороший инструмент как htop для наблюдения, какие процессы используют большую память и сколько подкачки в целом используется.

1
ответ дан Jean Azzopardi 23 November 2019 в 03:34
поделиться

Я предполагаю, что Вы могли получить хорошее предположение путем выполнения top и поиска активных процессов с помощью большой памяти. Выполнение этого программно является более твердым---, просто смотрят на бесконечные дебаты об уничтожающей эвристике OOM Linux.

Свопинг является функцией наличия большей памяти в активный использование, чем установлено, таким образом, обычно трудно обвинить его на единственном процессе. Если это - продолжающаяся проблема, лучшее решение состоит в том, чтобы установить больше памяти или внести другие системные изменения.

2
ответ дан dmckee 23 November 2019 в 03:34
поделиться

Не совсем ясно, подразумеваете ли Вы, что хотите найти процесс, у кого есть большинство выгруженных страниц или процесс, кто заставил большинство страниц быть выгруженным.

Для первого можно выполнить top и заказать подкачкой (нажмите 'Op'), для последнего можно работать vmstat и искать ненулевые записи для 'так'.

10
ответ дан Ronny Vindenes 23 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: