То же самое здесь, чтение /proc/$pid/cmdline для специального $pid было очень медленным, даже когда состояние равно R. И благодаря ссылкам выше, которые указывают, что это может быть связано с NUMA, я обнаружил, что это вызвано numad перемещает процессы с узлов на узлы, это из /var/log/numad.log:
Thu Jul 18 20:06:41 2019: Advising pid 9565 ($name) move from nodes (0-1) to nodes (1)
Thu Jul 18 20:06:45 2019: PID 9565 moved to node(s) 1 in 3.91 seconds
Thu Jul 18 20:11:50 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:12:00 2019: PID 9565 moved to node(s) 1 in 9.72 seconds
Thu Jul 18 20:17:05 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:17:23 2019: PID 9565 moved to node(s) 1 in 17.85 seconds
Thu Jul 18 20:22:28 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:22:51 2019: PID 9565 moved to node(s) 1 in 22.73 seconds
Thu Jul 18 20:27:56 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:28:23 2019: PID 9565 moved to node(s) 1 in 26.88 seconds
Thu Jul 18 20:33:28 2019: Advising pid 9565 ($name) move from nodes (1) to nodes (1)
Thu Jul 18 20:33:44 2019: PID 9565 moved to node(s) 1 in 15.49 seconds
При перемещении процессов чтение командной строки происходит медленно, потому что командная строка находится в пользовательском пространстве, а ядру требуется блокировка (? )страницу и прочитайте.
Я предполагаю, что последующее перемещение с того же node1 на node1 необходимо, потому что процесс 9565 находился на node1, но он мог использовать удаленную память.
% numactl -s
policy: default
preferred node: current
physcpubind: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
cpubind: 0 1
nodebind: 0 1
membind: 0 1
Спасибо.
Обновлен данный образец скрипта со следующими изменениями.
filterStartTime
и filterEndTime
на основе времени начала во второй строке входного файла #!/usr/bin/awk -f
BEGIN {
testDurationMins=60
rampTimeMins=5
outputFileName="test-result-filtered-without-rampup.jtl"
rampTimeMillis=rampTimeMins*60*1000
# Enter the start time
# (not required, if NR conditional is used)
startTime=0
# Calculate Start filter time in milliseconds
# (not required, if NR conditional is used)
filterStartTime=startTime+rampTimeMillis
# Filter end time
filterEndTime=0
# Calculate the test duration in milliseconds
testDurationMillis=testDurationMins*60*1000
FS=","
rowCount=0
}
{
if (NR==1){
#Write header to the output file
print > outputFileName
}
if (NR==2){
#Set the filter start and end times
startTime=$1
filterStartTime=startTime+rampTimeMillis
filterEndTime=filterStartTime+testDurationMillis
}
if (NR>2 && $1> filterStartTime && $1<filterEndTime){
rowCount++
print >> outputFileName
}
}
END {
print "" rowCount
}
Не используйте shebang для вызова awk, используйте shebang для вызова оболочки, а затем вызовите awk. См. https://stackoverflow.com/a/61002754/1745001, почему.
Я бы сделал так, как ты хочешь:
#!/usr/bin/env bash
awk -F',' '
NR==FNR {
if (NR==2) {
fiveMins = 5*60*1000*1000
begTime = $1 + fiveMins
}
endTime = $1 - fiveMins
next
}
(FNR==1) || ( (begTime <= $1) && ($1 <= endTime) ) {
print
rowCount++
}
END {
print rowCount+0 | "cat>&2"
}
' "$1" "$1"
или вы можете получить метку времени из последней строки, используя tail
(, вдохновленную ответом @Greeonline)вместо того, чтобы дважды читать файл в awk:
#!/usr/bin/env bash
awk -v lastTime="$(tail -n 1 "$1" | cut -d',' -f1)" -F',' '
NR==2 {
fiveMins = 5*60*1000*1000
begTime = $1 + fiveMins
endTime = lastTime - fiveMins
}
(NR==1) || ( (begTime <= $1) && ($1 <= endTime) ) {
print
rowCount++
}
END {
print rowCount+0 | "cat>&2"
}
' "$1"
В любом случае вы бы назвали это как:
scriptname input.csv > output.csv
или добавьте > output.csv
после сценария awk в сценарии оболочки, если вы не возражаете против жесткого -кодирования имени выходного файла.
Вышеприведенное предполагает, что в вашем CSV-файле есть строка заголовка, которую вы хотите напечатать в выходных данных.
Обратите внимание, что, не используя shebang для вызова awk, я могу использовать оболочку, чтобы делать то, что она делает лучше всего, т. е. вызывать другие команды и использовать аргументы скрипта несколько раз, и просто вызывать awk, чтобы делать то, что он делает лучше всего, т. е. обрабатывать text, что приводит к более лаконичному, надежному и эффективному сценарию, чем в противном случае.