Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Решено! Как определить узкое место системы (проц/память/винт/настройки системы)?  (Прочитано 5735 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Int_20h

  • Автор темы
  • Участник
  • *
  • Сообщений: 137
    • Просмотр профиля
Очень странная ситуация происходит у меня на домашнем сервере (AMD Phenom II x2 555, Socket AM2+, 4Gb RAM).

Там стоит:
Apache/2.2.14 (Ubuntu)
MySQL 5.1.41-3ubuntu12.6
PHP 5.3.2

На данном сервере я отлаживаю свои PHP-скрипты, часть из которых объектно ориентированные с использованием MySQL. Некоторые из этих скриптов ОЧЕНЬ объектно ориентированные, т.е. работают с объектами, исходники которых занимают по 50Kb, при этом данные объекты содержат внутри себя еще несколько объектов и т.д.

Недавно потребовалось пересчитать свойства в 150-300 таких объектах, запустил я скрипт и он выполнялся примерно 40-50 секунд. В целом не очень большое время для такого объема информации, но, естественно, обработку хочется ускорить. Для того чтобы оценить загрузку процессора запускаю top во время выполнения скрипта и вижу только mysqld, который грузит процессор на 1%. iotop тоже ничего особенного не показывает.

Получается ОЧЕНЬ СТРАННАЯ ситуация: скрипт выполняется почти минуту, php проц не загружает вообще, mysql его загружает на 1%, apache'а в top'е нет и в помине.
Теперь меня мучает вопрос: что мешает при таких обстоятельствах загрузить процессор хотя бы на 50% и выполнить скрипт не за минуту, а за 10 секунд?
Как узнать в какое узкое место уперлась система?

Пользователь решил продолжить мысль 24 Октября 2010, 17:39:41:
P.S. Никаких данных из сети в объектах не содержится, т.е. от скорости канала время обработки не зависит.
« Последнее редактирование: 25 Октября 2010, 20:36:57 от Int_20h »

Оффлайн Raptor26

  • Активист
  • *
  • Сообщений: 286
  • Ubuntu 11.04
    • Просмотр профиля
может жесткий диск или фаиловая система на нем?

Оффлайн Sam Stone

  • Старожил
  • *
  • Сообщений: 1131
    • Просмотр профиля
Re: Как определить узкое место системы (проц/п
« Ответ #2 : 24 Октября 2010, 22:28:17 »
1) iotop (мож чего с винта усиленно читает)
2) дебажить не учили?
Jellyfish 6.5.0-45-generic
2690v4 64Gb

Оффлайн Int_20h

  • Автор темы
  • Участник
  • *
  • Сообщений: 137
    • Просмотр профиля
kostja@srv232:~$ iotop
Total DISK READ: 127.94 K/s | Total DISK WRITE: 410.95 K/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
11046 be/4 mysql       3.88 K/s  108.55 K/s  ?unavailable?  mysqld

iotop нечего особенного не показывает. Диски в системе легко выдают 90Mb/s на чтение и 80Mb/s на запись, значения которые дает iotop даже "нагрузкой" язык не поворачивается назвать...

А зачем дебажить? Я могу поставить xDebug, покажет он мне что такая-то процедура выполняется 100 раз по 0,5 секунды, а дальше-то что?

Я логично предполагаю, что если бы PHP занял 99% процессорного времени, то процедура бы выполнялась не по 0,5 секунды, а по 0,005 секунды. Как дебагер мне поможет понять, почему этого не происходит?

Вопрос не в том, где в моем коде ошибка (я подразумеваю, как раз, что он очень хорошо оптимизирован), вопрос в том, почему вся эта братия (Apache, PHP, MySQL) загружают процессор на 1%, при  этом скрипт выполняется 50 секунд?

P.S. Еще удивляет то, что PHP и Apache'а, в отличие от mysql, в top'е вообще не значатся.
« Последнее редактирование: 25 Октября 2010, 12:12:30 от Int_20h »

Оффлайн Дмитрий Бо

  • Погонщик серверов
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 3549
  • Я не техподдержка, я за порядком слежу
    • Просмотр профиля
А в php.ini или как там его ограничение на мозги не стоит? Или ещё где.

Оффлайн gregory5

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5085
    • Просмотр профиля
Цитировать
Диски в системе легко выдают 90Mb/s на чтение и 80Mb/s на запись
Стояли такие диски, после смены на одноблинкик со скоростью чтения 140 мб записи 1хх мб, я заметил ощутимый прирост отклика системы, также возросла скорость поиска, 80-90 мб это либо довольно старые hdd либо замедленные грин версии, предназначение у таких дисков как правило файло помойка, но ни как не система где требуется хороший отклик, следующий шаг это построение массивов различной сложности (другие варианты не предлагаю т.к. дороги)

Оффлайн Int_20h

  • Автор темы
  • Участник
  • *
  • Сообщений: 137
    • Просмотр профиля
в php.ini стоит

memory_limit = 1024M

не знаю. есть ли инструкция,которая ограничивает лимит процессорного времени в php, я ее точно не настраивал.

насчет дисков - да, это WD Green 5400rpm, но вряд ли это объясняет проблему. База MySQL занимает 50Mb, хранится в innoDB. На компе с 4 Gb памяти вся эта база должна быть закэширована 10 раз. Я просто не могу поверить в то, что даже самый медленный диск при таком размере базы будет вызывать такие тормоза.

Впрочем, сегодня вечером специально перенесу базу на tmpfs и проверю производительность.

Оффлайн Sam Stone

  • Старожил
  • *
  • Сообщений: 1131
    • Просмотр профиля
А зачем дебажить? Я могу поставить xDebug, покажет он мне что такая-то процедура выполняется 100 раз по 0,5 секунды, а дальше-то что?
Оптимизировать ее. Может ты ее и хорошо написал для единичного запуска, а когда сотни раз в цикле начинаешь крутить - вылезают все задержки. 100 простых селектов из базы не всегда быстрее одного сложного.
Как вариант - попробовать на другом хосте запустить (например на виртуалке).

dbg
« Последнее редактирование: 25 Октября 2010, 18:44:09 от sanb »
Jellyfish 6.5.0-45-generic
2690v4 64Gb

Оффлайн alecsartania

  • Старожил
  • *
  • Сообщений: 1565
  • УМка.
    • Просмотр профиля
А зачем дебажить?
надо выяснить куда деваются временные таймы при выполнении программы, а то мож все таки кто-то кого то ждет а потом быстро быстро выполняется ;-)
тогда надо семафор этот ловить. например какой общий ресурс лочится.
 дебаг.
Дома Linux Mint 21.1 / 22.00

Оффлайн Int_20h

  • Автор темы
  • Участник
  • *
  • Сообщений: 137
    • Просмотр профиля
Огромное спасибо всем, кто помогал. Особенно alecsartania и Sam Stone.

Вопрос решен. Пока я пребываю в неком шоке, поскольку не могу логически объяснить результатов...

Ребята подсказали про семафор и лоченые ресурсы, я подумал, что единственная зона, где может возникнуть подобный семафор - MySQL. Начал копать дальше, прочитал, что базы в MyISAM, в отличие от InnoDB, производят параллельные вставки. Поскольку при пересчете свойств объектов они сначала считывались, а потом сохранялись, подумал, что это может иметь значение. Сменил формат баз данных, в которых хранились свойства, на MyISAM.

В результате, тот же самый скрипт без изменений за 0,5 секунды просчитывает массив в 10 раз больше чем раньше. MySQL при этом, как и положено, загружает процессор на 50-60%.

Вот такой вот бред... За счет смены формата баз удалось добиться ускорения в сотни раз...  :-\ :idiot2:

 

Страница сгенерирована за 0.077 секунд. Запросов: 23.