Это может быть прозрачная проблема с огромными страницами, когда поток ядра khugepaged буквально извлекает оперативную память для ее дефрагментации или создает огромные страницы из 4-килобайтных.
Ядро могло принять решение о включении огромных страниц, учитывая довольно большой объем системной оперативной памяти.
Проверьте содержимое этих двух настраиваемых параметров ядра:
/sys/kernel/mm/transparent_hugepage/enabled
/sys/kernel/mm/transparent_hugepage/defrag
Если их содержимое always
, вы можете изменить never
и посмотреть, исчезнут ли всплески/зависания процессора.
Я предлагаю вам попробовать подход xargs, т.е.:
alias xyz='command1; command2 | xargs pqr'
Это эквивалентно запуску pqr
с command2
в качестве входного аргумента
Использование псевдонима обычно не является хорошей практикой в не -интерактивных сценариях оболочки(BashFAQ/080). То, как у вас есть псевдоним, определенный в вашем OP, только первые команды считываются со стандартного ввода, потому что ;
прерывает ваш стандартный ввод от выхода за пределы вашей первой команды.
Одним из возможных способов является группировка команд с использованием {..}
, чтобы любые направления -относились ко всему набору команд в группе. Вы все еще можете сохранить свое alias
определение и выполнить
alias xyz='{ command1; command2; }'
В этом случае ваш comamnd1
без необходимости получает копию стандартного ввода. Вы можете закрыть его, выполнив
alias xyz='{ command1 < /dev/null ; command2 - ; }'
Или используйте функции для определения ваших команд внутри.
xyz() {
command1; command2
}
Если ваша оболочка bash
или zsh
поддерживает подстановку процессов, вы можете просто определить command2
для получения содержимого стандартного ввода в качестве позиционных аргументов. В отношении -определите свою функцию как
xyz() {
command1
command2 "$@"
}
, а затем вызовите команду(pqr
)как
xyz < <(pqr)
Простая демонстрация вышеизложенного,
zoo() { date; sed 's/foo/boo/' "$@"; }
zoo < <(echo food) #(or) zoo <<<"food"
Mon Nov 25 02:44:49 EST 2019
bood
Чтобы передать что-то на стандартный ввод command2
в списке команд
command1; command2
вы должны убедиться, что command1
не читается со стандартного ввода. Это можно сделать, перенаправив стандартный ввод с /dev/null
на command1
:
command1 </dev/null; command2
Это оставляет вас с псевдонимом
alias xyz='command1 </dev/null; command2`
который вы не не сможете вызвать с помощью
pqr | xyz -f -
, так как это было бы эквивалентно
pqr | command1 </dev/null; command2 -f -
то же, что и
pqr | command1 </dev/null
command2 -f -
Вместо этого определите xyz
как функцию оболочки:
xyz () {
command1 </dev/null
command2 "$@"
}
Здесь command2
получит как стандартный ввод функции, так и любые аргументы командной строки, переданные функции.
Теперь вы сможете использовать это как в конвейере pqr | xyz -f -
.
Если (и только если )аргументы -f -
, которые вы передаете в command2
, говорят «читать со стандартного ввода» (с -
, обозначающим стандартный ввод ), тогда вы может вместо -
передать подстановку процесса на xyz
, если ваша оболочка поддерживает это:
xyz -f <(pqr)
С приведенной выше функцией это будет то же самое, что и
command1 </dev/null
command2 -f <(pqr)