Техническая оптимизация проектов (для злых программеров)

Начну с лирического вступления: раньше я был супер-перфекционистом, и пытался все сделать по максимуму круто и правильно, насколько на каждый конкретный момент хватало знаний и умений. Но через какое-то наконец пришло осознание того, что все сделать идеально нельзя, да и все равно потом оно перестанет казаться идеальным, ведь всегда можно что-то улучшить. Поэтому теперь я стараюсь фокусироваться на главном, а обо всякой хрени не думать вообще.

Приведу простой пример - нубы очень любят пофлеймить на тему того, как лучше делать конкатенацию строк - “маша $otshila васю” или “васе все равно “.$poh.” на Машу” и начинаются безумные холивары на тему производительности и так далее. А по большому счету - да какая хрен разница сгенерится страница на 5 миллисекунд быстрее или нет ? В общем надеюсь моя позиция по этому поводу ясна :twisted:
Теперь перейдем к конкретике - волшебный проект gickr.com

Говорю сразу, код был написан не мной, а моим рыжим сотоварищем, и после просмотра кода этого самого товарища мне хотелось придушить :) Но код работал, гифки генерились, и это было самое главное! Жило все это добро на VPS от паршивой компании Dreamhost и в какой-то момент нам просто вырубили imagemagick с формулировкой “ребята, вы ЧО ! охренели создавать 100 процессов imagemagick и нагружать наш суперпупермегамногоядерный Xeon на 99%”. И вот тут-то и началась оптимизация.

Шаг номер 1 - Найди bottle neck (то бишь узкое место)

Главное выяснить что отжирает больше всего процессорного времени, это делается простыми засечками типа:

function CurTime() {
list($usec, $sec) = explode(' ', microtime());
$time2 = (double) $usec + (double) $sec;
if(!defined("__TIME__"))define("__TIME__", $time2);
$l = round($time2 - __TIME__, 6);
return $l;
}
CurTime();
тут куча кода ...
echo CurTime();

Шаг номер 2 - заоптимизируй это самое узкое место нахрен

В моем случае выяснилось две вещи:

1) Если ставить ватермарк на каждый кадр гифа, а потом уже собирать сам гиф, то это получается в 3 раза быстрее чем ставить ватермарк на уже готовый гиф! В общем если подумать почему так, то все становится ясно, ведь чтобы поставить ватермарк на готовый гиф, надо его опять разобрать на кадры, шлепнуть лого и собрать опять.

2) Если 500 человек захотят одновременно сделать большие гифы, то они все равно положат почти любой сервак.

Первая проблема решилась понятно как, а от второго была придумана совершенно тупая защита: я стал хранить текущие процессы по обработке в базе, и теперь разрешаю обрабатывать одновременно не больше 4 гифоф, а остальные идут в очередь, вот и вся история.

Шаг номер 3 - заоптимизируй все остальное если не в лом и делать нечего :)

Ну а тут открывается простор для полета фантазии и действий, можно бесконечно оптимизировать БД и запросы к ней, можно например поставить APC и кэшировать популярные запросы, можно вообще присобачить HTML кэш :) Помнится когда я сделал одну системку, на которой сейчас работает 49 мемберок одной известной в узких кругах партнерки, меня только HTML кэш и спас (и это все на кластере из 8 машин)

В общем тема оптимизации неисчерпаема, поэтому более конкретные вопросы жду в комментах, постараюсь на все ответить как могу.

P.S. Вообще, все ведь уже поняли что все самое интересное на этом блоге происходит именно в комментах ? :)

Запись опубликована в рубрике Полезное, Серверное. Создать закладку наpermalink. Оставить комментарийили trackback:Trackback URL.

27 комментариев

  1. Опубликован 14 ноября 2007 в 16:50 | Прямая ссылка

    “я стал хранить текущие процессы по обработке в базе, и теперь разрешаю обрабатывать одновременно не больше 4 гифоф, а остальные идут в очередь, вот и вся история.”
    Я бы также сделал - в очередь нах :) Но думаю это не выход, нужно что-то по другому сделать.

  2. Опубликован 14 ноября 2007 в 17:36 | Прямая ссылка

    Верно. Оптимизация кода - это как искусство, в котором нет предела совершенства. Программерский ДЗЕН рулит:)

  3. Опубликован 14 ноября 2007 в 18:05 | Прямая ссылка

    хоть и не програмер я, все равно интересно почитать )

  4. Опубликован 14 ноября 2007 в 18:12 | Прямая ссылка

    Винни, после прочтения книги Getting Real осознание пришло?

  5. Опубликован 14 ноября 2007 в 18:25 | Прямая ссылка

    Главное - найти это узкое место, а про ватермарк красивое решение :)

  6. Опубликован 14 ноября 2007 в 19:55 | Прямая ссылка

    Оффтоп: где же обещанный трип-репорт о днюхе :( ?
    На чем счас вертится гикр? Я имею ввиду, движок на чем написан?

  7. Опубликован 14 ноября 2007 в 20:33 | Прямая ссылка

    Начну с лирического вступления: раньше я был супер-перфекционистом, и пытался все сделать по максимуму круто и правильно, насколько на каждый конкретный момент хватало знаний и умений. Но через какое-то наконец пришло осознание того, что все сделать идеально нельзя, да и все равно потом оно перестанет казаться идеальным, ведь всегда можно что-то улучшить. Поэтому теперь я стараюсь фокусироваться на главном, а обо всякой хрени не думать вообще.

    Очень знакомо. Только я до сих пор не могу полностью избавиться от этого избыточного перфекционизма. Именно поэтому «Форум миллионеров 2.0» так и болтается недоделанный у меня в локалке. Эх…
    Ну не могу я! Когда знаю, что можно сделать лучше. Хорошо бы научиться иногда быть пофигистом и в технических вопросах.

  8. Опубликован 14 ноября 2007 в 20:43 | Прямая ссылка

    Уже сколько раз я ходил по этой волшебной ссылке, и так до сих пор и не понял, нафига нужен этот сайт и чё там делает такая куча народу :)

  9. Опубликован 14 ноября 2007 в 21:04 | Прямая ссылка

    >Уже сколько раз я ходил по этой волшебной ссылке, и так до сих пор и не понял, нафига нужен этот сайт и чё там делает такая куча народу :)
    аналогично ))

  10. Опубликован 14 ноября 2007 в 21:14 | Прямая ссылка

    Такие проекты надо держать на дедиках, да и вообще там все лучше держать :)

  11. Опубликован 15 ноября 2007 в 0:58 | Прямая ссылка

    Блогер из Алтая, это отличный выход )

    Miku, к стыду своему скажу что я ее так и не читал, некогда было, а осознание пришло года на три раньше чем появилась книга

    Андрей Зарубин, движок на ГОЛОМ ПОХАПЭ :))) репорт будет маленький

    Тормоз, надо просто четко представлять цель, и все рюшечки нах

    Random, Денис, это нормально ))) главное что там есть куча народа ))) они там чтобы кликать на рекдаму )))

    Arser, конечно оно давно вертится на злом оптероне с 4Гб памяти и так далее … просто изначально проект задумывался как просто фиговина, так, развлечение ))

  12. Опубликован 15 ноября 2007 в 1:32 | Прямая ссылка

    Хм, я тоже на DreamHoster’е. Брал у них дедик специально под Дигг… А у тебя VPS все выдерживает! ;) Так ты съехал с Дрима?

  13. Опубликован 15 ноября 2007 в 1:34 | Прямая ссылка

    c дрима съехали уже давно, сервак у них постоянно вис, надоело

    сейчас отдельный мощный сервак под гикр, и еще один сервер под все остальные проекты

  14. Опубликован 15 ноября 2007 в 3:53 | Прямая ссылка

    Ура дождались, спасибо!
    Очень интересно, я надеюсь это будет серия постов ? :)

  15. Alex
    Опубликован 15 ноября 2007 в 10:22 | Прямая ссылка

    stwinnie привет

    смотрю тут много интересных людей…

    а что если всей дружной компанией заму- сотворить какой - лиБо проджект?!

  16. Опубликован 16 ноября 2007 в 5:23 | Прямая ссылка

    Замечание по процедурному вопросу, насчёт строк - ‘одинарные кавычки’ быстрее двойных. :)

  17. Опубликован 16 ноября 2007 в 5:29 | Прямая ссылка

    hckd, да не про что писать серию ) либо я недостаточно компетентен, ты же знаешь мой девиз - “Все просто”

    Alex, тут на самом деле много интересных людей, и наверняка каждый занят своим делом, какой проект ты предлагаешь сделать ?

    alexf2000, вот вот ! именно про это я и писал )) на сколько микротысячных секунды эти кавычки быстрее и какая на хрен разница ? )))

  18. Опубликован 17 ноября 2007 в 7:19 | Прямая ссылка

    мдааа.. как все знакомо.. я вот еще пофигистом не стал, вернее сам то я по жизни пофигист но не в пхп, постоянно ищу где что ужать или ускорить, в итоге проэкты растягиваются на неограниченное время..
    вот тут решил собрать простые способы по оптимизации кода, если у кого что есть добавить простого и эфективного - милости прошу в коменты

  19. Опубликован 17 ноября 2007 в 7:26 | Прямая ссылка

    Гари, че-то ссылка не проканала

  20. Опубликован 17 ноября 2007 в 7:29 | Прямая ссылка

    Нихрена не так:
    профайлинг делается с помошью 2 вещей.
    1.хдебуг, 2 вин как там его (на сайте хдебуга есть )
    со всем остальным согдласен очень

  21. Опубликован 17 ноября 2007 в 7:32 | Прямая ссылка
  22. Опубликован 17 ноября 2007 в 7:35 | Прямая ссылка

    интернет бизнес, тебя прямо так и зовут ? ну что за привычка ставить в имя левые якоря :evil: на тему xdebug - ну да, если не в лом ставить …

    Гари, твои оптимизации дадут тебе максимум 2 миллисекунды выигрыша, а вот париться с ними много :), это как раз то, о чем я писал в начале поста

  23. Опубликован 17 ноября 2007 в 7:57 | Прямая ссылка

    да я то это знаю :), но говорю же что пофигистом еще не стал, а все что там описано, у меня уже на автомате, на уровне подсознания можно сказать используется..
    вообще если используется связка php+mysql, то реально ускорить скрипт можно оптимизировав то что делается на стороне мускула: запросы, оптимизация самих таблиц, индексы и т.п. ну и естественно сократить количество самих запросов если это возможно..

  24. Опубликован 18 ноября 2007 в 1:07 | Прямая ссылка

    Оптимизация процесс интересный… и зачастую бесконечный =)

  25. Опубликован 18 ноября 2007 в 17:27 | Прямая ссылка

    Воспользовался советом. А по теме: согласен про бесконечность оптимизации.

  26. Yura
    Опубликован 19 ноября 2007 в 19:26 | Прямая ссылка

    > 1.хдебуг, 2 вин как там его (на сайте хдебуга есть )

    Wincachegrind, кстати да… намного нагляднее и мощнее считалки микросекунд ;)
    Вот кстати хорошее решение установки всего этого дела под винду: http://forum.dklab.ru/viewtopic.php?p=105669

  27. taras
    Опубликован 20 ноября 2007 в 16:39 | Прямая ссылка

    Поздравляю! Можно немного не по теме?! Об одном проекте! Москва претендует стать столицей первых юношеских Олимпийских игр! В настоящий момент я владею доменами moscow2010.org и .net, которые у меня хотели перекупить, но я отказался! Набросал дизайн! Прикрутил к Друпалу! И честно говоря не знаю как дальше быть! Решение о выборе Столице будет в конце февраля(немного времени ещё есть)! Но зашел в тупик! Как можно на этом деле заработать! Подскажи плиз! Могу поделиться если реально поможете! 8) Предложения мона присылать на почту taras.kovalyov@gmail.com

2 trackback'ов

  1. [...] Интересное на сегодня: Мантры известных блогеров, Бу-га-га блог про стринги), Анализируем купленный трафик, Солнечный город наконецто запущен, Техническая оптимизация проектов [...]

  2. [...] Техническая оптимизация проектов (для злых программер… [...]

Оставить комментарий

Ваш e-mail никогда не будет опубликован или передан третьим лицам. Обязательные поля отмечены *

*
*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>