Как удалить результаты теста в течение периода линейного изменения из файла результатов теста CSV?

То же самое здесь, чтение /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

Спасибо.

1
24.08.2021, 04:01
2 ответа

Обновлен данный образец скрипта со следующими изменениями.

  1. Вычислить filterStartTimeи filterEndTimeна основе времени начала во второй строке входного файла
  2. Записать вывод в файл для дальнейшего анализа
#!/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
  }

1
24.08.2021, 09:49

Не используйте 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, что приводит к более лаконичному, надежному и эффективному сценарию, чем в противном случае.

2
24.08.2021, 22:19

Теги

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