يعد تحليل الأداء وضبطه أداة قوية للتحقق من امتثال الأداء للعملاء.
يمكن استخدام تحليل الأداء لاختبار الاختناقات في البرنامج ، مع اتباع نهج علمي للتحقق من صحة تجارب الضبط. تحدد هذه المقالة نهجًا عامًا لتحليل الأداء وضبطه ، باستخدام خادم الويب Go كمثال.
يعد Go مناسبًا بشكل خاص هنا لأنه يحتوي على أدوات التنميط pprof
في المكتبة القياسية.
إستراتيجية
لنقم بإنشاء قائمة محورية لتحليلنا الهيكلي. سنحاول استخدام بعض البيانات لاتخاذ القرارات بدلاً من إجراء تغييرات بناءً على الحدس أو التخمين. للقيام بذلك ، دعنا نفعل هذا:
- نحدد حدود التحسين (المتطلبات) ؛
- نحسب عبء المعاملات للنظام ؛
- نقوم بتنفيذ الاختبار (إنشاء البيانات) ؛
- نحن نراقب.
- نحن نحلل - هل تم استيفاء جميع المتطلبات؟
- التأسيس بطريقة علمية ووضع الفرضية ؛
- .
HTTP
— HTTP-, Postgresql . Prometheus, node_exporter Grafana .
, ( ) :
. ? , ? , , 10 000 .
Google SRE Book . , :
- : 99% 60;
- : , . ;
- : , , , n+1.
, . SRE SLO \ , . - !
. .
Vegeta HTTP, :
$ make load-test LOAD_TEST_RATE=50
echo "POST http://localhost:8080" | vegeta attack -body tests/fixtures/age_no_match.json -rate=50 -duration=0 | tee results.bin | vegeta report
. ( , ) (, CPU, IOPS) , , , .
— , . :
, . Go (pprof) flame graph, . .
, , .
. , , . , . , . : make load-test LOAD_TEST_RATE=X
.
50
. , 50 ( ), — . : . HTTP Request Latency SLO 60. , .
:
10000 / 50 = 200 + 1
.
500
, 500 :
, . — , . , , 500 25-40. 99 SLO 60, .
:
10000 / 500 = 20 + 1
.
1000
! , 1000 , SLO. p99 . , p100 , 60. , , .
1000 , pprof
, , . HTTP endpoint pprof
, curl:
$ curl http://localhost:8080/debug/pprof/profile?seconds=29 > cpu.1000_reqs_sec_no_optimizations.prof
:
$ go tool pprof -http=:12345 cpu.1000_reqs_sec_no_optimizations.prof
, . Brendan Gregg:
X — , ( ), Y , [top]. — . — . — CPU, — . , , , .
—
. . , , , , , , , .
Brendan Gregg . ( ). — , ( ). :
— , . HTTPServe 65% , runtime, runtime.mcall
, mstart
gc
, . : 5% DNS:
, , Postgresql. FindByAge
:
, , , : \ , . , DNS, 13% .
: HTTP, .
—
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
if err != nil {
return nil, err
}
, ,
1000 , p99 SLO 60!
?
10000 / 1000 = 10 + 1
!
2000
, , 2000 , p100 60, p99 SLO.
:
10000 / 2000 = 5 + 1
3000
3000 p99 60. SLO , :
10000 / 3000 = 4 + 1 ( , . )
.
—
3000 :
6% . , , .
: , , , . , .
—
MaxIdleConns ( ):
db, err := sql.Open("postgres", dbConnectionString)
db.SetMaxOpenConns(8)
db.SetMaxIdleConns(8)
if err != nil {
return nil, err
}
, ,
3000
p99 60 p100!
flame graph , ! pg(*conn).query
— .
, . , , — . Go , , .