Ускоряем биллинг в 20 раз.Профилируем, кэшируем, ленимся<br />Алексей Романчук,<br />Сибирьэнерго-Биллинг<br />
Что у нас есть<br />Web приложение на Java (spring, hibernate)<br />64 CPU cores<br />32 Gb RAM<br />Oracle<br />24 CPU co...
Чего мы хотим добиться<br />Расчет за 6 часов<br />Планируемый объем 7 000 000 услуг<br />325 услуг/с<br />
Что сделано<br />Garbage Collector работает нормально<br />Hibernate 2nd level cache<br />Нетоткровенно медленных sql<br /...
Как мы считаем<br />1<br />2<br />3<br />4<br />………………………………<br />28<br />29<br />30<br />31<br />19<br />
Как мы считаем<br />Электроэнергия<br />Электроэнергия с учетом льгот<br />Счет<br />Показания счетчика<br />Тариф<br />Ль...
Профилирование<br />Попытки все исправить в одном месте…<br />… не работают<br />Используем только реальные данные<br />Пр...
Инструменты профилирования<br />
Профилируем!<br />
Что тормозит<br />Районный коэффициент<br />Показания счетчика<br />Тариф<br />Количество жильцов дома<br />Количество льг...
Как мы считаем<br />1<br />2<br />3<br />4<br />………………………………<br />28<br />29<br />30<br />31<br />19<br />
Кэширование?<br />Что будем кэшировать?<br />Сколько будем кэшировать / TTL?<br />Где будем кэшировать?<br />Время жизни к...
Кэширование!<br />Что? Некоторые расчетные параметры<br />Сколько? Все!<br />Где? RAM<br />Время жизни?Время выполнения за...
Статистика – наше все!<br />Cache hit, cache miss, cache put<br />Количество элементов и размер кэша<br />Время вычисления...
Что нам дало кэширование<br />75-80 услуг/c<br />Увеличение скорости расчета в 6 раз<br />
Профилируем!<br />
Как мы считаем<br />
Алгоритмы расчета<br />
Алгоритмы расчета<br />
Ленимся<br />
Ленимся<br />Алгоритмы должны остаться простыми<br />Возможность изменять алгоритмы без перезапуска<br />Минимальные измен...
Javassist<br />Инструментация на лету<br />Высокая скорость по сравнению с proxy<br />Неизменность исходного кода<br />Сло...
Результаты<br />170-190услуг/с<br />Увеличение скоростирасчета в 3 раза<br />
Профилируем!<br />
Все?<br />
Что то не так<br />
WUUUUUT?!<br />85%<br />
Как мы считаем<br />
Как мы считаем<br />
Кто нас блокирует?<br />Наш код<br />Log4J<br />Hibernate<br />Spring<br />…<br />
Самый страшный антипаттерн<br />многопоточного программирования<br />ненужный<br />Блокирующий доступ на чтение<br />
Мы сами<br />Почему? <br />Антипаттерн<br />Как исправить?<br />Переписать нормально<br />
Log4J<br />Почему?<br />Частыe вызовы логгера<br />Как исправить?<br />Один расчет – один лог<br />
Hibernate, Spring framework<br />Почему?<br />Антипаттернв различных проявлениях<br />Как исправить?<br />Сделать патч. Пр...
java.util.Calendar<br />Почему?<br />Антипаттерн c использованием<br />Hashtable<br />Как исправить?<br />clone() вместо n...
Блокировки<br />340 услуг/с<br />Прирост скорости – 1.5 раза<br />Log4J – 3-4%<br />EhCache – 1%<br />
Чего мы добились<br />15 услуг/c => 340 услуг/с<br />1 человеко-месяц<br />Кэширование – 6х<br />Lazy вычисления – 3х<br /...
?<br />Алексей Романчук<br />http://www.se-b.ru<br />romanchuk@se-b.ru<br />alexey.romanchuk@gmail.com<br />@1esha<br />
Самый страшный антипаттерн<br />многопоточного программирования<br />
Upcoming SlideShare
Loading in …5
×

CodeFest 2011. Романчук А. — Ускоряем биллинг в 20 раз: профилируем, оптимизируем, ленимся

1,171 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,171
On SlideShare
0
From Embeds
0
Number of Embeds
238
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

CodeFest 2011. Романчук А. — Ускоряем биллинг в 20 раз: профилируем, оптимизируем, ленимся

  1. 1. Ускоряем биллинг в 20 раз.Профилируем, кэшируем, ленимся<br />Алексей Романчук,<br />Сибирьэнерго-Биллинг<br />
  2. 2. Что у нас есть<br />Web приложение на Java (spring, hibernate)<br />64 CPU cores<br />32 Gb RAM<br />Oracle<br />24 CPU cores<br />“Много дисков”raid<br />
  3. 3. Чего мы хотим добиться<br />Расчет за 6 часов<br />Планируемый объем 7 000 000 услуг<br />325 услуг/с<br />
  4. 4. Что сделано<br />Garbage Collector работает нормально<br />Hibernate 2nd level cache<br />Нетоткровенно медленных sql<br />10-15 услуг/с<br />5+ суток<br />
  5. 5. Как мы считаем<br />1<br />2<br />3<br />4<br />………………………………<br />28<br />29<br />30<br />31<br />19<br />
  6. 6. Как мы считаем<br />Электроэнергия<br />Электроэнергия с учетом льгот<br />Счет<br />Показания счетчика<br />Тариф<br />Льготы<br />База данных<br />
  7. 7. Профилирование<br />Попытки все исправить в одном месте…<br />… не работают<br />Используем только реальные данные<br />Профилируем все части системы<br />
  8. 8. Инструменты профилирования<br />
  9. 9. Профилируем!<br />
  10. 10. Что тормозит<br />Районный коэффициент<br />Показания счетчика<br />Тариф<br />Количество жильцов дома<br />Количество льготников в доме<br />
  11. 11. Как мы считаем<br />1<br />2<br />3<br />4<br />………………………………<br />28<br />29<br />30<br />31<br />19<br />
  12. 12. Кэширование?<br />Что будем кэшировать?<br />Сколько будем кэшировать / TTL?<br />Где будем кэшировать?<br />Время жизни кэша?<br />Область действия кэша?<br />
  13. 13. Кэширование!<br />Что? Некоторые расчетные параметры<br />Сколько? Все!<br />Где? RAM<br />Время жизни?Время выполнения задачи<br />Область действия кэша? Задача<br />
  14. 14. Статистика – наше все!<br />Cache hit, cache miss, cache put<br />Количество элементов и размер кэша<br />Время вычисления элемента<br />Время доступа к элементу кэша<br />Общее время в рамках задачи<br />
  15. 15. Что нам дало кэширование<br />75-80 услуг/c<br />Увеличение скорости расчета в 6 раз<br />
  16. 16. Профилируем!<br />
  17. 17. Как мы считаем<br />
  18. 18. Алгоритмы расчета<br />
  19. 19. Алгоритмы расчета<br />
  20. 20. Ленимся<br />
  21. 21. Ленимся<br />Алгоритмы должны остаться простыми<br />Возможность изменять алгоритмы без перезапуска<br />Минимальные изменения кода<br />
  22. 22. Javassist<br />Инструментация на лету<br />Высокая скорость по сравнению с proxy<br />Неизменность исходного кода<br />Сложность отладки<br />
  23. 23. Результаты<br />170-190услуг/с<br />Увеличение скоростирасчета в 3 раза<br />
  24. 24. Профилируем!<br />
  25. 25. Все?<br />
  26. 26. Что то не так<br />
  27. 27. WUUUUUT?!<br />85%<br />
  28. 28. Как мы считаем<br />
  29. 29. Как мы считаем<br />
  30. 30. Кто нас блокирует?<br />Наш код<br />Log4J<br />Hibernate<br />Spring<br />…<br />
  31. 31. Самый страшный антипаттерн<br />многопоточного программирования<br />ненужный<br />Блокирующий доступ на чтение<br />
  32. 32. Мы сами<br />Почему? <br />Антипаттерн<br />Как исправить?<br />Переписать нормально<br />
  33. 33. Log4J<br />Почему?<br />Частыe вызовы логгера<br />Как исправить?<br />Один расчет – один лог<br />
  34. 34. Hibernate, Spring framework<br />Почему?<br />Антипаттернв различных проявлениях<br />Как исправить?<br />Сделать патч. Применить патч. Завести баг.<br />
  35. 35. java.util.Calendar<br />Почему?<br />Антипаттерн c использованием<br />Hashtable<br />Как исправить?<br />clone() вместо newInstance()<br />
  36. 36. Блокировки<br />340 услуг/с<br />Прирост скорости – 1.5 раза<br />Log4J – 3-4%<br />EhCache – 1%<br />
  37. 37. Чего мы добились<br />15 услуг/c => 340 услуг/с<br />1 человеко-месяц<br />Кэширование – 6х<br />Lazy вычисления – 3х<br />Блокировки – 1.5х<br />
  38. 38. ?<br />Алексей Романчук<br />http://www.se-b.ru<br />romanchuk@se-b.ru<br />alexey.romanchuk@gmail.com<br />@1esha<br />
  39. 39. Самый страшный антипаттерн<br />многопоточного программирования<br />
  40. 40. Простое решение<br />самого страшного антипаттерна многопоточного программирования<br />

×