Устранение проблем с производительностью в Linux - непростая задача, и я не буду описывать все возможности. Однако большинство проблем обычно делятся на 3 категории: высокая загрузка ЦП , высокая загрузка памяти или использование ввода-вывода . ПРИМЕЧАНИЕ: все они взаимосвязаны.
Первый тип: top -b -n 1 | head -15
Это даст вам следующий результат:
top - 15:32:09 up 19 days, 2:32, 2 users, load average: 0.61, 0.46, 0.42
Tasks: 208 total, 1 running, 207 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.9%us, 3.6%sy, 0.0%ni, 95.2%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 16430432k total, 15188864k used, 1241568k free, 304624k buffers
Swap: 2097148k total, 112k used, 2097036k free, 7342636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16106 user 20 0 4070m 2.1g 2.1g S 30 13.5 4678:57 VirtualBox
26070 user 20 0 6113m 749m 697m S 6 4.7 628:55.93 VirtualBox
14863 user 9 -11 272m 3192 1804 S 2 0.0 5:57.19 pulseaudio
1 root 20 0 24724 2548 1276 S 0 0.0 0:05.32 init
2 root 20 0 0 0 0 S 0 0.0 0:00.15 kthreadd
3 root 20 0 0 0 0 S 0 0.0 0:33.45 ksoftirqd/0
6 root RT 0 0 0 0 S 0 0.0 0:03.74 migration/0
7 root RT 0 0 0 0 S 0 0.0 0:02.51 watchdog/0
Сначала посмотрите на среднюю нагрузку . Проверьте здесь , чтобы понять, что это означает (очень важно понимать эту концепцию).
ВАЖНО: Здесь ниже я предполагаю, что у вас одноядерный (1 ЦП, без двухъядерного процессора, ...)
Если средняя загрузка меньше 1 через 5 минут, значит, загрузка ЦП в порядке. На данный момент я не уверен, что это могло быть. Продолжайте устранять неполадки, как если бы это было НЕ нормально.
Если средняя загрузка больше 1 через 5 минут, значит, загрузка ЦП высока. Чтобы понять, почему загрузка ЦП высока, проверьте следующие записи в выходных данных, указанных сверху:
В выходных данных выше вы можете увидеть список процессов. Посмотрите на столбец % CPU и проверьте, видите ли вы процессы, использующие 100%. Тот факт, что они используют 100% ЦП, может быть, а может и не быть проблемой, но в качестве теста было бы хорошо их остановить.
Чтобы остановить процесс наверху, нажмите «k» и введите значение, найденное в PID для данного процесса.
ВАЖНО: Запишите название процесса. Прежде чем убивать кого-либо, попробуйте понять, что они делают (поиск в гугле). Вы можете остановить только тот процесс, которым владеете (отметьте в столбце USER) как обычный пользователь (в противном случае вы должны быть пользователем root, но будьте осторожны с тем, что вы убиваете, в случае сомнений не делайте этого). Также обратите внимание на значения % us и % sy , us обозначает пользователя, а sy - систему. В основном они соответственно представляют использование ЦП в пространстве пользователя и пространстве ядра.
Если система ускоряется, то, вероятно, причиной проблемы является убитый вами процесс. В противном случае продолжить.
Считайте значение в % wa . Это высоко? (более 50%), если он высокий, это означает, что входы / выходы (I / O) на диск высоки и ЦП ожидает.
Используйте команду iostat
, чтобы определить, какой диск медленный.
Вы также можете проверить использование памяти.
Введите бесплатно -m в командной строке. Вы должны увидеть что-то вроде этого:
total used free shared buffers cached
Mem: 16045 14835 1209 0 298 7172
-/+ buffers/cache: 7365 8679
Swap: 2047 0 2047
Проверьте значение в используемых буферах / кэше. Если используется слишком много памяти, значение должно быть близким к общему.
Проверьте также используемое значение в разделе подкачки (если у вас есть раздел подкачки). Если он высокий, что означает близкое к максимальному значению, наблюдаемому в разделе total (для Swap), то это означает, что ваша система много меняет местами, а это означает, что она выполняет подкачку на диск (что намного медленнее, чем RAM).
Опять же, это может не решить вашу проблему, но это хорошее начало.
Вы можете сделать все это в операторе BEGIN
, используяgetline
awk '
BEGIN {
while(1) {
line = sep = ""
for (i = 1; i < ARGC; i++) {
if ((getline < ARGV[i]) <= 0) exit
line = line sep $2
sep = OFS
}
print line
}
}' input{1..n} > out
Вы можете создать команду paste
для объединения всех вторых столбцов:
cmd="paste"
for x in input{1..n}; do
cmd="$cmd <(awk '{print \$2;}' $x)"
done
echo $cmd
eval $cmd
используя этот пост в качестве ссылки
awk '{a[FNR] = a[FNR]" " $2}END{for(i=1;i<=FNR;i++) print a[i]}' input{1..n}
массив содержит каждую строку из разных файлов
FNR количество записей, прочитанных в текущем входном файле, обнуляется в начале каждого файла.
END{for(i=1;i<FNR;i++) print a[i]}
печатает содержимое массива a в конце файла
Я бы использовал инструмент pr
, предназначенный для столбцов данных :
awk '{print $2}' input{1..n} | pr -t --columns=n > out
Это предполагает, что каждый файл имеет одинаковое количество строк.