Как проверить, насколько часто мой процесс вытесняется ядром?

Поскольку расширение переменной не было заключено в кавычки, пустое слово, возникающее в результате расширения $varsome, полностью удаляется.

Давайте создадим функцию, которая выводит количество аргументов, которые она получает, и сравним случай -в кавычках и без кавычек:

$ args() { echo "got $# arguments"; }
$ var=""
$ args $var
got 0 arguments    
$ args "$var"
got 1 arguments

То же самое происходит в вашем случае сid:id -u $varточно так же, как просто id -u, когда varпусто. Так как idне видит имени пользователя, по умолчанию печатает информацию о текущем пользователе.

Если цитировать "$var", то результат будет другим:

$ var=""
$ id -u "$var"
id: ‘’: no such user

С этим исправлением вы можете использовать id, чтобы узнать, существует ли пользователь. (Нам не нужны здесь выходные данные, так что перенаправьте их подальше.)

check_user() { 
    if id -u "$1" >/dev/null 2>&1; then
        echo "user '$1' exists"
    else
        echo "user '$1' does not exist"
    fi
}
check_user root
check_user asdfghjkl

Это напечатает user 'root' existsи user 'asdfghjkl' does not exist.


Это немного противоположно обычным проблемам, возникающим из-за неожиданного разбиения на слова переменных, не заключенных в кавычки. Но основная проблема та же самая и исправлена ​​тем, что половина ответов здесь говорит :всегда цитирует расширения переменных (, если вы не знаете, что хотите поведение без кавычек ).

См.:

2
22.06.2021, 14:04
1 ответ

Вы можете использоватьperf; например,

perf stat -e context-switches,cpl_cycles.ring0,cpl_cycles.ring123 your_command

выдаст сводку, аналогичную

 Performance counter stats for 'your_command':

                 1      context-switches                                            
        11,890,096      cpl_cycles.ring0                                            
         9,980,265      cpl_cycles.ring123                                          

       0.011218937 seconds time elapsed

       0.007533000 seconds user
       0.003766000 seconds sys

, который показывает, что во время выполнения your_commandбыло одно переключение контекста (на другой процесс, а не на ядро ​​), и ЦП потратил 54% своего времени на выполнение кода ядра.

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

3
28.07.2021, 11:23

Теги

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