π₯ ΠΠ΄Π½Π° ΡΡΡΠΎΠΊΠ° Π² ΠΊΠΎΠ½ΡΠΈΠ³Π΅ ΡΡΠΊΠΎΡΠΈΠ»Π° production-ΠΎΡΠ²Π΅Ρ Ρ 126β230 ΠΌΡ Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅ΠΌ 9 ΠΌΡ
PaweΕ Urbanek ΡΠΎΠ±ΡΠ°Π» ΠΎΡΠ΅Π½Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ½ΡΠΉ Π³Π°ΠΉΠ΄ ΠΏΠΎ ΠΏΡΠΎΡΠΈΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Rust, Π³Π΄Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ΄ΡΡ Π½Π΅ ΠΏΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏΡ Β«ΡΡΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½Π΅Π΅Β», Π° ΠΏΠΎ ΡΠ΅Π°Π»ΡΠ½ΠΎΠΉ ΠΎΡΠ΄Π°ΡΠ΅.
ΠΠ· ΠΊΠ΅ΠΉΡΠΎΠ²:
`N+1 SQL` β 21 Π·Π°ΠΏΡΠΎΡ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΠ»ΠΈ Π² ΠΎΠ΄ΠΈΠ½ JOIN, ΡΡΠ½ΠΊΡΠΈΡ ΡΡΠΊΠΎΡΠΈΠ»Π°ΡΡ ΡΠΎ 104 Π΄ΠΎ 70 ΠΌΠΊΡ.
Π’ΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ
HTTP-Π²ΡΠ·ΠΎΠ²Π° β `tokio::try_join!`, ΠΈΡΠΎΠ³ΠΎΠ²ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΏΠΎΡΡΠΈ Π²Π΄Π²ΠΎΠ΅ ΠΌΠ΅Π½ΡΡΠ΅.
ΠΠ΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Π½Π°ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ Brotli Π² `maplibre/martin` β ΡΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ»Π° Π²ΡΠ΅Π³ΠΎ 27,9 KB/s. ΠΠ΄Π½Π° ΠΏΡΠ°Π²ΠΊΠ° ΠΊΠΎΠ½ΡΠΈΠ³Π° Π΄Π°Π»Π° ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ 57x ΡΡΠΊΠΎΡΠ΅Π½ΠΈΠ΅, Π° latency ΡΠΏΠ°Π»Π° Π΄ΠΎ <9 ΠΌΡ.
ΠΡΡ ΠΆΡΡΡΡΠ΅ ΠΊΠ΅ΠΉΡ Ρ `write lock`, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅ΡΠΆΠ°Π»ΠΈ Π½Π° Π²ΡΡΠΌ HTTP round trip. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅Π½ΠΎΡΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ P95 Π΄Π»Ρ ΡΠΈΡΠ°ΡΠ΅Π»Π΅ΠΉ ΡΡΡ
Π½ΡΠ» Ρ 1,11 ΡΠ΅ΠΊΡΠ½Π΄Ρ Π΄ΠΎ 9,42 ΠΌΠΊΡ.
Π ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΠΊΠ»Π°ΡΡΠΈΠΊΠ° Tokio: unbounded channel ΠΌΠΎΠ»ΡΠ° Π½Π°ΠΊΠΎΠΏΠΈΠ» 73 ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ consumer Π½Π΅ ΡΡΠΏΠ΅Π²Π°Π». ΠΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΏΡΠΎΡΡΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠ΅ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΊ OOM.
ΠΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΎΠΊ ΠΈΠ· Π³Π°ΠΉΠ΄Π°:
ΡΠ½Π°ΡΠ°Π»Π° SQL ΠΈ HTTP, ΠΏΠΎΡΠΎΠΌ locks ΠΈ channels, ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ CPU profiling.
ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΎΠ΄ΠΈΠ½ Π»ΠΈΡΠ½ΠΈΠΉ ΠΏΠΎΡ
ΠΎΠ΄ Π² Π±Π°Π·Ρ ΠΎΠ±ΡΡΠ½ΠΎ ΡΡΠΎΠΈΡ Π΄ΠΎΡΠΎΠΆΠ΅, ΡΠ΅ΠΌ ΡΠΎΡΠ½ΠΈ ΠΌΠ΅Π»ΠΊΠΈΡ
ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ Π²Π½ΡΡΡΠΈ hot loop.
π `hotpath.rs/blog/profiling-rust-guide`
#Rust #Performance #Profiling #Tokio #Backend