How to spot bottleneck in web applications

How to spot bottleneck in web applications

6280bd845b84c195239417cdb33575c8?s=128

K.Skaradziński

May 22, 2017
Tweet

Transcript

  1. How to spot bottleneck in web applications

  2. “Hello World”

  3. Krzysztof “skowron-line” Skaradziński

  4. #1 Don't think about optimization during development, focus on requirements

  5. greenfield vs brownfield

  6. Greenfield Development happens when you start a brand new project,

    as in, clean slate development. No legacy code lying around, no old development to maintain. You’re starting afresh, from scratch, from a blank slate, with no restrictions on what you’re doing (other than business rules of course).
  7. Brownfield Development happens when business decide to develop/improve upon an

    existing application infrastructure. As an upgrade is implemented into an existing solution, the development is said to be Brownfield.
  8. None
  9. None
  10. Web Debug Toolbar

  11. None
  12. Performance

  13. None
  14. None
  15. blackfire.io

  16. X-Blackfire-Query BLACKFIRE_QUERY

  17. None
  18. None
  19. The Wall Clock Time, or Wall Time, for a function

    call is the measure of the real time it took for PHP to execute its code: the difference between the time at which PHP entered the function and the time at which PHP left the function
  20. The CPU time is the amount of time the CPU

    was used for processing instructions.
  21. The I/O time is the time the CPU waited for

    input/output (I/O) operations.
  22. Network activity includes calls to databases like MySQL, PostgreSQL, or

    MongoDB; HTTP calls to web services and APIs; calls to cache systems like Redis and Memcached; communications with services like queues, email daemons, remote filesystems; etc.
  23. Disk activity occurs when a program reads files from the

    filesystem, including when PHP loads a script or class file.
  24. Wall Time = CPU Time + I/O Time I/O Time

    = Network Time + Disk Time
  25. The inclusive time allows you to find the critical path

    of an application.
  26. The exclusive time allows to find the function calls to

    optimize first.
  27. blackfire --samples=1 curl http://www.goldenline.pl/ Blackfire cURL completed Graph URL https://blackfire.io/profiles/dce9448e-be85-4312-9021-760a5e27a67e/graph

    Wall Time 228ms CPU Time 191ms I/O Time 37ms Memory 43.5MB Network n/a SQL n/a
  28. None
  29. None
  30. blackfire run php palindrome.php Blackfire Run completed Graph URL https://blackfire.io/profiles/b9a7eafa-cd2f-49f9-b955-5667ac76fa33/graph

    Wall Time 2.59ms CPU Time 1.14ms I/O Time 1.45ms Memory 18.8KB Network n/a SQL n/a
  31. Graph

  32. None
  33. None
  34. References

  35. blackfire --samples=1 --new-reference curl http://www.goldenline.pl/ Blackfire cURL completed Graph URL

    https://blackfire.io/profiles/4cf06d0d-afab-484c-ba7a-c7377f7c4e48/graph Reference: #1. Untitled Wall Time 233ms CPU Time 228ms I/O Time 4.75ms Memory 43.4MB Network n/a SQL n/a
  36. blackfire --samples=1 --reference=1 curl http://www.goldenline.pl/ Blackfire cURL completed Graph URL

    https://blackfire.io/profiles/compare/4cf06d0d-afab-484c-ba7a-c7377f7c4e48...5e719 fd0-5839-4495-866a-142181a0f4a1/graph Wall Time 207ms -26ms -14.5% CPU Time 176ms -52ms -14.5% I/O Time 30.6ms +25.9ms +45.8% Memory 43.4MB +8.88KB n/s Network 13µs 294B 1rq SQL n/a -
  37. None
  38. None
  39. Recommendations

  40. blackfire --samples=1 --reference=1 curl http://www.goldenline.pl/ Blackfire cURL completed Graph URL

    https://blackfire.io/profiles/compare/4cf06d0d-afab-484c-ba7a-c7377f7c4e48...5e719 fd0-5839-4495-866a-142181a0f4a1/graph 1 recommendation https://blackfire.io/profiles/5e719fd0-5839-4495-866a-142181a0f4a1/graph?settin gs%5BtabPane%5D=recommendations Wall Time 207ms -26ms -14.5% CPU Time 176ms -52ms -14.5% ...
  41. None
  42. Assertions

  43. .blackfire.yml tests: "Home Page": path: "/" assertions: - metrics.redis.connections.count ==

    1 - metrics.amqp.connections.count == 0 - main.memory < 40Mb
  44. https://blackfire.io/docs/validator

  45. None
  46. None
  47. Writing assertions on the main profile costs is as easy

    as adding a valid dimension name to the main. Prefix: • count • wall_time • cpu_time • memory • peak_memory • io • network_in • network_out
  48. Test Scenarios

  49. .blackfire.yml scenarios: Pricing page: - /pricing Integrations page: - /integrations

    Blackfire.yml Validator: - path: /docs/validator method: POST samples: 10
  50. Only for HTTP requests, not CLI command

  51. Server / Database / Custom logs

  52. long_query_time=1

  53. # Time: 100224 19:50:45 # User@Host: root[root] @ localhost [127.0.0.1]

    # Query_time: 89.843750 Lock_time: 0.000000 Rows_sent: 6256088 Rows_examined: 3 use we; SET timestamp=1267037445; select * from places,employees,departments,votes;
  54. Code review

  55. {{ app.user }} {{ app.request.query.get('page') }} vs {% set user

    = app.user %} {% set page = app.request.query.get('page') %}
  56. $marquise=Marquise::initialize(); // heavy logic if ($request->get('_route') !== 'homepage') { return;

    } $marquise->show();
  57. <div class="project-list"> {% for project in projects %} <p>{{ project.name

    }}</p> {% if is_granted('SUPER_ADMIN') %} <a href="{{ path('project', { 'id': project.id }) }}" class="btn btn-lg btn-primary btn-huge">{{ 'remove' | trans({}, 'top') }}</a> {% endif %} {% endfor %} </div>
  58. <div class="project-list"> {% for project in projects %} <p>{{ project.name

    }}</p> {% if is_granted('SUPER_ADMIN') %} <a href="{{ path('project', { 'id': project.id }) }}" class="btn btn-lg btn-primary btn-huge">{{ 'remove' | trans({}, 'top') }}</a> {% endif %} {% endfor %} </div>
  59. #1 Don't think about optimization during development, focus on requirements

  60. That’s all

  61. Thanks