HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлрд╛рд╕реНрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо

HTTP / 2 рдореЗрдВ рдорд╛рдирдХ рд╣реЗрдбрд░ рдХрд╛ рд╕рдВрдкреАрдбрд╝рди рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпреВрдЖрд░рдЖрдИ, рдХреБрдХреА, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рд╢рд░реАрд░ рдЕрднреА рднреА рджрд╕рд┐рдпреЛрдВ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рдмреНрд╕рдЯреНрд░реЗрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЯреЛрдХрди, рдЦреЛрдЬ рдФрд░ рддреБрд▓рдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрджрд┐ HTTP рдкрд╛рд░реНрд╕рд░ рдХреЛ рднрд╛рд░реА рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдХрд╛рд░реНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╡реНрдпрд╛рдкрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди HTTP рддрд╛рд░ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдПрдВ рд╣реИрдВред рдпрд╣ рдЗрд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ рдХрд┐ рдЯреЗрдореНрдкреЗрд╕реНрдЯрд╛ рдПрдлрдбрдмреНрд▓реНрдпреВ HTTP рдкрд╛рд░реНрд╕рд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЖрдзреБрдирд┐рдХ рдУрдкрди рд╕реЛрд░реНрд╕ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдИ рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рд╕рдмрд╕реЗ рддреЗрдЬ рд╣реИред


рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ рдХреНрд░рд┐рдЬрд╝рд╛рдиреЛрд╡рд╕реНрдХреА (krizhanovsky) рд╕рдВрд╕реНрдерд╛рдкрдХ рдФрд░ рд╕рд┐рд╕реНрдЯрдо рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЯ рдЯреЗрдореНрдкреЗрд╕реНрдЯрд╛ рдЯреЗрдХреНрдиреЛрд▓реЙрдЬреАрдЬ, рд▓рд┐рдирдХреНрд╕ / x86-64 рдореЗрдВ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮред рдЕрд▓реЗрдХреНрдЬреЗрдВрдбрд░ HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреА рдЦрд╝рд╛рд╕рд┐рдпрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗ, рдмрддрд╛рдПрдВрдЧреЗ рдХрд┐ рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЦрд░рд╛рдм рдХреНрдпреЛрдВ рд╣реИрдВ, рдФрд░ рдЯреЗрдореНрдкреЗрд╕реНрдЯрд╛ рдПрдлрдбрдмреНрд▓реНрдпреВ рд╕рдорд╛рдзрд╛рди рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдмрд┐рд▓реНрд▓реА рдХреЗ рддрд╣рдд: HTTP рдлреНрд▓рдб рдЖрдкрдХреЗ HTTP рдкрд╛рд░реНрд╕рд░ рдХреЛ рдПрдХ рдЕрдбрд╝рдЪрди рдореЗрдВ рдХреИрд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, x86-64 рдмреНрд░рд╛рдВрдЪ рдЧрд▓рддрдлрд╣рдореА рдХреЗ рд╕рд╛рде x86-64 рд╕рдорд╕реНрдпрд╛рдПрдВ, рд╡рд┐рд╢рд┐рд╖реНрдЯ HTTP рдкрд╛рд░реНрд╕рд░ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдХреИрд╢рд┐рдВрдЧ рдФрд░ рдЖрдЙрдЯ-рдСрдл-рдореЗрдореЛрд░реА рдореЗрдореЛрд░реА, рдПрдлрдПрд╕рдПрдо рдХреА рддреБрд▓рдирд╛ рдбрд╛рдпрд░реЗрдХреНрдЯ рдбрдВрдк, рдЬреАрд╕реАрд╕реА рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди, рдСрдЯреЛ-рд╡реИрд░рд┐рдлрд┐рдХреЗрд╢рди, рд╕реНрдЯреНрд░реИрд╕реНрдкрди () рдХреЗ рд╕рд╛рде - рдФрд░ strcasecmp () - HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕, SSE, AVX2 рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреА рддрд░рд╣ рдФрд░ AVX2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣рдорд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ред

Tempesta Technologies рдореЗрдВ рд╣рдо рдХрд╕реНрдЯрдо рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдЬрдЯрд┐рд▓ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╣реИрдВред рд╣рдо рд╕рдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдкрд╣рд▓реЗ рд╕рдВрд╕реНрдХрд░рдг WAF рдХреЗ рдореВрд▓ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрд░реНрд╡ рдХрд░рддреЗ рд╣реИрдВред рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдлрд╝рд╛рдпрд░рд╡реЙрд▓ (WAF) рдПрдХ HTTP рдкреНрд░реЙрдХреНрд╕реА рд╣реИ: рдпрд╣ рд╣рдорд▓реЛрдВ (рд╡реЗрдм тАЛтАЛрдФрд░ DDoS) рдХреЗ рд▓рд┐рдП HTTP рдЯреНрд░реИрдлрд╝рд┐рдХ рдХреЗ рдмрд╣реБрдд рдЧрд╣рд░реЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдкрд╣рд▓рд╛ рдХреЛрд░ рд▓рд┐рдЦрд╛ рдерд╛ред

рдкрд░рд╛рдорд░реНрд╢ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо Tempesta FW рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдпрд╣ рдПрдкреНрд▓реАрдХреЗрд╢рди рдбрд┐рд▓реАрд╡рд░реА рдХрдВрдЯреНрд░реЛрд▓рд░ (ADC) рд╣реИред рд╣рдо рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рдЖрд╡реЗрджрди рд╡рд┐рддрд░рдг рдирд┐рдпрдВрддреНрд░рдХ


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд┐рд▓реАрд╡рд░реА рдХрдВрдЯреНрд░реЛрд▓рд░ рдПрдХ HTTP рдкреНрд░реЙрдХреНрд╕реА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╡рд░реНрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдРрд╕реЗ рдлреАрдЪрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдБрдЧрд╛ рдЬреЛ рд╕реБрд░рдХреНрд╖рд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ - DDoS рдФрд░ рд╡реЗрдм рд╣рдорд▓реЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдореИрдВ рд╕реАрдорд╛рдУрдВ рдХрд╛ рднреА рдЙрд▓реНрд▓реЗрдЦ рдХрд░реВрдВрдЧрд╛, рдФрд░ рдореИрдВ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ред



рдкреНрд░рджрд░реНрд╢рди


Tempesta FW рд▓рд┐рдирдХреНрд╕ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕реНрдЯреИрдХ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдХрдИ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди, рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ - рдпрд╣ рд╕рд╕реНрддреЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1.8 рдорд┐рд▓рд┐рдпрди рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╢реАрд░реНрд╖ рд▓реЛрдб рдкрд░ Nginx рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 3 рдЧреБрдирд╛ рддреЗрдЬ рд╣реИ рдФрд░ рдХрд░реНрдиреЗрд▓ рдмрд╛рдпрдкрд╛рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдореЗрдВ рднреА рддреЗрдЬ рд╣реИ ред



рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрд░ рдкрд░, рдпрд╣ Seastar рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдкреНрд░рджрд░реНрд╢рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ ScyllaDB (DPDK рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореБрд╕реАрдмрдд


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рдЬрдиреНрдо рддрдм рд╣реБрдЖ рдЬрдм рд╣рдордиреЗ 2013 рдореЗрдВ рдкреАрдЯреА рдПрдПрдл рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣ WAF рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдУрдкрди рд╕реЛрд░реНрд╕ HTTP рддреНрд╡рд░рдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред Nginx, HAProxy, Varnish рдпрд╛ Apache Traffic рдЕрдЪреНрдЫреЗ HTTP рдПрдХреНрд╕реАрд▓реЗрдЯрд░ рд╣реИрдВ: рдпреЗ рдХрдВрдЯреЗрдВрдЯ рдлрд╛рдЗрди, рдХреИрд╢, рдореЙрдбрд┐рдлрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдФрд░ рдлрд╝рд┐рд▓реНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЕрдЧрд░ рдиреЗрдЯрд╡рд░реНрдХ-рд╕реНрддрд░ рдХрд╛ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рд╣реИ, рддреЛ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЬрд╛рд░реА рдХреНрдпреЛрдВ рди рд░рдЦреЗрдВ рдФрд░ рдЯреАрд╕реАрдкреА / рдЖрдИрдкреА рд╕реНрдЯреИрдХ рдореЗрдВ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди-рд╕реНрддрд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЯреЗрдВрдкрд╕реНрдЯрд╛ рдПрдлрдбрдмреНрд▓реНрдпреВ - рдПрдЪрдЯреАрдЯреАрдкреА рддреНрд╡рд░рдХ рдФрд░ рдлрд╝рд╛рдпрд░рд╡реЙрд▓ рдХрд╛ рдПрдХ рд╕рдВрдХрд░ рдирд┐рдХрд▓рд╛ ред

рдиреЛрдЯ: Nginx рдХрд╛ рдЙрдкрдпреЛрдЧ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдФрд░ рд▓реЛрдХрдкреНрд░рд┐рдп рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХреЛрдИ рдЕрдиреНрдп рдУрдкрди рд╕реЛрд░реНрд╕ HTTP рд╕рд░реНрд╡рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдПрдЪрдЯреАрдЯреАрдкреА


рдЖрдЗрдП рд╣рдорд╛рд░реЗ HTTP рдЕрдиреБрд░реЛрдз (HTTP / (1, ~ 2) рдХреЛ рджреЗрдЦреЗрдВ)



рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдпреВрдЖрд░рдЖрдИ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред HTTP рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд╕рдордп рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рднрд╛рдЬрдХ рд▓рд╛рд▓ рдмреЛрд▓реНрдб рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ ред рдореИрдВ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░реВрдВрдЧрд╛: рдХрдИ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдбрд╝реЗ рддрд╛рд░, рд╕рд╛рде рд╣реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реАрдорд╛рдВрдХрдХ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрддрд┐рд░рд┐рдХреНрдд "рдЕрд░реНрдзрд╡рд┐рд░рд╛рдо" рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ "\ r \ n" рдЕрдиреБрдХреНрд░рдоред

HTTP / 2 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рднреА рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

HTTP / 2 рд╕реБрд╡рд┐рдзрд╛рдПрдБ


HTTP / 2 рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдФрд░ рдмрд╛рдЗрдирд░реА рдбреЗрдЯрд╛ рдХрд╛ рдорд┐рд╢реНрд░рдг рд╣реИ ред рдпрд╣ рдорд┐рд╢реНрд░рдг рд╕рд░реНрд╡рд░ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдХрдиреЗрдХреНрд╢рди рдХреА рдмреИрдВрдбрд╡рд┐рдбреНрде рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИред

HPACK рдореЗрдВ HTTP / 2 рдПрдХ рдбрд╛рдпрдирд╛рдорд┐рдХ рдЯреЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ ред рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рдкрд╣рд▓рд╛ рдЕрдиреБрд░реЛрдз рдЕрдиреБрдХреВрд▓рд┐рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдЗрд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПред рдпрджрд┐ HTTP / 2 DDoS рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдХреЗрд╡рд▓ рдорд╛рдорд▓рд╛ рд╣реЛрдЧрд╛ред рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ, HTTP / 2 рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдкрд╛рда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдкрд╛рда рд╢реАрд░реНрд╖рдХ рдирд╛рдо, рдбреЗрдЯрд╛ред

рд╣рдлрд╝рдореИрди рдПрдиреНрдХреЛрдбрд┐рдВрдЧред рдпрд╣ рдПрдХ рд╕рд░рд▓ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдлрд╝рдореИрди рдХреЛ рд╕рдВрдкреАрдбрд╝рди рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ: рд╣рдлрд╝рдореИрди рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдмрд╛рдЗрдЯ рд╕реАрдорд╛ рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЖрдк рд╡реЗрдХреНрдЯрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЬрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдк 32 рдпрд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред

рдХреБрдХреАрдЬрд╝, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ, рд╕рдВрджрд░реНрднрдХрд░реНрддрд╛, рдпреВрдЖрд░рдЖрдИ рдмрд╣реБрдд рдмрдбрд╝реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдлрд╝рдореИрди рдХреЛ рд╣рдЯрд╛ рджреЗрдВ, рдлрд┐рд░ рдЗрд╕реЗ рдПрдХ рдирд┐рдпрдорд┐рдд HTTP рдкрд╛рд░реНрд╕рд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬреЗрдВ, рд╡рд╣реА HTTP / 1 рдореЗрдВред рдпрджреНрдпрдкрд┐ рдпрд╣ RFC рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдордд рд╣реИ, рдХреБрдХреАрдЬрд╝ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧреЛрдкрдиреАрдп рдбреЗрдЯрд╛ рд╣реИ - рдЖрдкрдХреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЛ рдЙрдирдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд╣реАрдВ рджреЗрдиреА рдЪрд╛рд╣рд┐рдПред

HTTP рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдзреАрдореА рдХрд░реЗрдВ ред рд╕рднреА HTTP рд╕рд░реНрд╡рд░ рдкрд╣рд▓реЗ HTTP / 2 рдХреЛ рдбреАрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрди рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ HTTP / 1 рдкрд╛рд░реНрд╕рд░ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ рдЬреЛ HTTP / 1 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

HTTP / 1 рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдореЗрдВ рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ?

  • рдЖрдкрдХреЛ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
  • рдЖрдкрдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЬрд▓реНрджреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг рдЯреНрд░реИрдлрд╝рд┐рдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╕рдмрд╕реЗ рдзреАрдореЗ (рд╕рдмрд╕реЗ рдХрдордЬреЛрд░) рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рдПрдХ рдлрд┐рд▓реНрдЯрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдзреАрдореЗ рднрд╛рдЧреЛрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рд╡реЗ рднреА рдЬрд▓реНрджреА рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВред

Nginx рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓


рдЖрдЗрдП HTTP рдмрд╛рдврд╝ рдХреЗ рддрд╣рдд nginx рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рджреЗрдЦреЗрдВред рдПрдХреНрд╕реЗрд╕ рд▓реЙрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░реЗрдВ рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдзреАрдорд╛ рди рд╣реЛред рдЬрдм рднреА рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдкреГрд╖реНрда рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдкрд╛рд░реНрд╕рд░ рд╢реАрд░реНрд╖ рдкрд░ рдЬрд╛рддрд╛ рд╣реИред
%рдкреНрд░рддреАрдХ рдХрд╛ рдирд╛рдо
1,5719ngx_http_parse_header_line
1,0303ngx_vslprintf
0.6401memcpy
0.5807recv
0.5156ngx_linux_sendfile_chain
0.4990ngx_http_limit_req_handler
рд╡рд╛рдо - "рд╕рдкрд╛рдЯ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓"ред рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдмрд╕реЗ рдЧрд░реНрдо рд╕реНрдерд╛рди рдЕрдЧрд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рднрд╛рд░реА рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдмрд╛рдж рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрддрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджреЛ рдмрд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдирд╣реАрдВ рдорд┐рд▓реЗрдЧреАред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдордиреЗ рдЙрд╕реА Nginx рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛, рдЬреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреА рдкреВрд░реА рдкреВрдВрдЫ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдЧрд╛ред

HTTP рдкрд╛рд░реНрд╕рд░ рдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдПрдирдХреЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ


рдЖрдорддреМрд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд▓реВрдк ( while) рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЗрди рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рджреЛ рдЪрд░: рд░рд╛рдЬреНрдп ( state) рдФрд░ рд╡рд░реНрддрдорд╛рди рдбреЗрдЯрд╛ ( str_ptr)ред

рд╣рдо рдЪрдХреНрд░ (1) рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ (рдЪреЗрдХ рд╕реНрдЯреЗрдЯ) рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ (рдкреНрд░рддреАрдХ 'b') рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рддрд░реНрдХ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп (2) рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВред



рдЕрдВрдд рдореЗрдВ рдЬрд╛рдПрдВ switch(3) - рдпрд╣ рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рджреВрд╕рд░рд╛ рд╕рдВрдХреНрд░рдордг рд╣реИ рдФрд░ рд╕рдВрднрд╡рддрдГ, рдЕрдиреБрджреЗрд╢ рдХреИрд╢ рдореЗрдВ рджреВрд╕рд░рд╛ рдорд┐рд╕ рд╣реИред рдлрд┐рд░ рд╣рдо рд╢реБрд░реБрдЖрдд while(4) рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдЧрд▓реЗ рдЪрд░рд┐рддреНрд░ рдХреЛ рдЦрд╛рддреЗ рд╣реИрдВ ...



... рдФрд░ рдлрд┐рд░ рд╕реЗ рдЕрдВрджрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВ case 2:ред

рдЬрдм рдПрдХ рдЪрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ stateрдорд╛рди рд╕реМрдВрдкрд╛ рдЧрдпрд╛ рд╣реИ2, рд╣рдо рдЕрдЧрд▓реЗ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╡реЗ рдлрд┐рд░ рд╕реЗ рдКрдкрд░ рдЧрдП рдФрд░ рдлрд┐рд░ рд╕реЗ рдиреАрдЪреЗ рдЪрд▓реЗ рдЧрдПред рд╣рдо рд╕рд┐рд░реНрдл рдиреАрдЪреЗ рдЬрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреЛрдб рджреНрд╡рд╛рд░рд╛ "рд╣рд▓рдХреЛрдВ рдореЗрдВ рдХрдЯреМрддреА" рдХрд░рддреЗ рд╣реИрдВред рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд░реНрд╕рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд░рдЧреЗрд▓ рд╕реАрдзреЗ рд╕рдВрдХреНрд░рдордг рдХреЗ рд╕рд╛рде рдПрдХ рдкрд╛рд░реНрд╕рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред



Nginx HTTP рдкрд╛рд░реНрд╕рд░


рдирдЧрдиреЗрдХреНрд╕ рдкрд╛рд░реНрд╕рд░ рдФрд░ рдЙрд╕рдХреЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред

рдирдЧрдиреЗрдХреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рд╕реЙрдХреЗрдЯ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдПрдбреЙрдкреНрдЯрд░ рдкрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдкрд░ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдмрдбрд╝рд╛ рдбреЗрдЯрд╛ рдЪрдВрдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрд╕ рдЪреАрдЬрд╝ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИред

рдирдЧреНрдиреЗрдХреНрд╕ рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджреЛ рдкрд╛рд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдкрд╣рд▓реЗ рдпрд╣ рд▓рдВрдмрд╛рдИ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдпрд╣ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╡рд╣ рдЯреЛрдХрди рдХреЗ рд▓рд┐рдП рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рдЯреЛрдХрди ("рдкрд░реАрдХреНрд╖рдг") рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реЗ рдкрд░, рдпрд╣ рдЯреЛрдХрди, рдЕрдиреБрд░реЛрдз рдХреЗ рдЕрдВрдд рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ ( Get) рдФрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ switch, рдЯреЛрдХрди рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред

for (p = b->pos; p < b->last; p++) {
    ...
    switch (state) {
    ...
    case sw_method:
        if (ch == ' ') {
            m = r->request_start;
            switch (p - m) {         // switch on token length!
            case 3:
                if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {
                ...
            }
            if ((ch < 'A' || ch > 'Z') && ch != '_' && ch != '-')
                return NGX_HTTP_PARSE_INVALID_METHOD;
            break;
    ...

"рдЬрд╛рдУ" рд╣рдореЗрд╢рд╛ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рдЪрдВрдХ рдореЗрдВ рд╣реИ ред Tempesta FW рдЬреАрд░реЛ-рдХреЙрдкреА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреА рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдордирдорд╛рдиреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЖ рд╕рдХрддрд╛ рд╣реИ: 1 рдмрд╛рдЗрдЯ рдпрд╛ рдкреНрд░рддреНрдпреЗрдХ 1000 рдмрд╛рдЗрдЯреНрд╕ред рдпрд╣ "рддрдВрддреНрд░" рд╣рдореЗрдВ рд╢реЛрднрд╛ рдирд╣реАрдВ рджреЗрддрд╛ред

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ switchрдЬреАрд╕реАрд╕реА рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЬреАрд╕реАрд╕реА


рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ ред рдмрд╛рдИрдВ рдУрд░ рдПрдиреБрдо рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рд╣реИ: 0 рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдлрд┐рд░ рд▓рдЧрд╛рддрд╛рд░ рд▓реЗрдмрд▓, 26 рд╕реНрдерд┐рд░рд╛рдВрдХ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдХреЛрдб рдЬреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджрд╛рдИрдВ рдУрд░ рдХреЛрдб рд╣реИ рдЬреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИред



рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, stateEAX рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдХ рд╕реНрдерд┐рд░ рдХреЗ рд╕рд╛рде рдЪрд░ рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВ ред рдЕрдЧрд▓рд╛, рд╣рдо рд╕рднреА рдмрд╛рдЗрдЯреНрд╕ рдХреЛ 8 рдмрд╛рдЗрдЯреНрд╕ (рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓) рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рдХреНрд░рдорд┐рдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдкрд░ рд╣рдо рдЗрд╕ рд╕рд░рдгреА рдореЗрдВ рдСрдлрд╝рд╕реЗрдЯ рдкрд░ рдкрд╛рд╕ рд╣реЛрддреЗ рд╣реИрдВ - рдпрд╣ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдбрдмрд▓ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рд╣реИред рдиреАрдЪреЗ рджрд╛рдИрдВ рдУрд░ рд╡рд╣ рдХреЛрдб рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рд╣реИред

рдпрд╣ рдореЗрдореЛрд░реА рдХреА рдбрдмрд▓ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ: рдпрджрд┐ рд╣рдореЗрдВ рдЧреБрдкреНрдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ, рддреЛ рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд╣рдо рд╕рд░рдгреА рдореЗрдВ рдкрддрд╛ рдвреВрдВрдврддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдЬрд╛рдирдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЬреАрд╡рди рдореЗрдВ рдпрд╣ рдЕрднреА рднреА рдЙрджрд╛рд╣рд░рдг рд╕реЗ рднреА рдмрджрддрд░ рд╣реИ - рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рдХреЗ рд▓рд┐рдП рдХрдВрдкрд╛рдЗрд▓рд░ рдЬреЗрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИрдПрдХ рд╕реНрдкреЗрдХреНрдЯрд░ рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреЛрдб рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ ред

рдмрд╛рдЗрдирд░реА рд╕рд░реНрдЪ ред рдЕрдЧрд▓рд╛ рдорд╛рдорд▓рд╛ switchрдЕрдиреБрдХреНрд░рдорд┐рдХ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рд╣реИред рдХреЛрдб рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм GCC рдЗрддрдиреЗ рдмрдбрд╝реЗ рд╕рд░рдгреА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд░рдгреА рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╡рд╣ рдмрд╛рдЗрдирд░реА рдЦреЛрдЬ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред



рджрд╛рдИрдВ рдУрд░ рд╣рдо рдПрдХ рдЕрдиреБрдХреНрд░рдорд┐рдХ рддреБрд▓рдирд╛, рдкрддреЗ рдкрд░ рд╕рдВрдХреНрд░рдордг рдФрд░ рддреБрд▓рдирд╛ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ - рджреНрд╡рд┐рдЖрдзрд╛рд░реА рдЦреЛрдЬ рдХреЛрдб рджреНрд╡рд╛рд░рд╛ рд╣реЛрддреА рд╣реИред

Nginx HTTP рдкрд╛рд░реНрд╕рд░ред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд░рд╛рдЬреНрдп рдорд╢реАрди рдирдЧреАрдирдХреНрд╕ рдХреНрдпрд╛ рд╣реИред рдЗрд╕рдореЗрдВ 9 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рдХреЛрдб рд╣реИ - рдпрд╣ рдорд╢реАрди рдкрд░ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рдХреИрд╢ рд╕реЗ рддреАрди рдЧреБрдирд╛ рдХрдо рд╣реИ рдЬрд┐рд╕ рдкрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдереЗ (рдЬреИрд╕рд╛ рдХрд┐ рдЬреНрдпрд╛рджрд╛рддрд░ x86-64 рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░)ред

$ nm -S /opt/nginx-1.11.5/sbin/nginx
| grep http_parse | cut -d' ' -f 2
| perl -le '$a += hex($_) while (<>); print $a'
9220

$ getconf LEVEL1_ICACHE_SIZE
32768

$ grep -c 'case sw_' src/http/ngx_http_parse.c
84

рдиреЗрдЧрдиреЗрдХреНрд╕ рд╣реЗрдбрд░ рдкрд╛рд░реНрд╕рд░ ngx_http_parse_header_line ()рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЛрдХрдирд░ рд╣реИред рдпрд╣ рд╣реЗрдбрд░ рдФрд░ рдЙрдирдХреЗ рдирд╛рдореЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╕ HTTP рд╣реЗрдбрд░ рдХреЗ рдЯреЛрдХрди рдХреЛ рд╣реИрд╢ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рд╣реЗрдбрд░ рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣реЗрдбрд░ рдЯреЗрдмрд▓ рдХреЛ рд╕реНрдХреИрди рдХрд░реЗрдВ рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЛ рджреЛрд╣рд░рд╛рдПрдВред

рд╣рдореЗрдВ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣реЗрдбрд░ рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреА рд╕рдЦреНрддреА рд╕реЗ рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП ред

Tempesta FW: HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рд╕рддреНрдпрд╛рдкрди


рд╣рдорд╛рд░реА рд░рд╛рдЬреНрдп рдорд╢реАрди рдЕрдзрд┐рдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реЛрдиреЗ рдХрд╛ рдПрдХ рдХреНрд░рдо рд╣реИ: рд╣рдо RFC рд╣реЗрдбрд░ рд╕рддреНрдпрд╛рдкрди рдФрд░ рддреБрд░рдВрдд рдХрд░рддреЗ рд╣реИрдВ, рдкрд╛рд░реНрд╕рд░ рдореЗрдВ, рд▓рдЧрднрдЧ рд╕рдм рдХреБрдЫ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдирдЧреНрдиреЗрдХреНрд╕ рдореЗрдВ 80 рд░рд╛рдЬреНрдп рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 520 рд╣реИрдВ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдЖрдЧреЗ рдмрдврд╝рддреЗ switch, рддреЛ рдпрд╣ 10 рдЧреБрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрддрд╛ред

рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╢реВрдиреНрдп-рдХреЙрдкреА I / O рд╣реИ - рд╡рд┐рднрд┐рдиреНрди рдЖрдХрд╛рд░реЛрдВ рдХреЗ рдЯреБрдХрдбрд╝реЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛рдЯ рд╕рдХрддреЗ рд╣реИрдВред рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдЦрдВрдбреВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдореЗрдВ рдХрдЯреМрддреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╢реВрдиреНрдп-рдХреЙрдкреА I / O рдореЗрдВ, "GET" (рд╢рд╛рдпрдж рд╣реА рдХрднреА) "GET", "GE" рдФрд░ "T" рдпрд╛ "G", "E" рдФрд░ "T" рдХреЗ рд░реВрдк рдореЗрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдХреЗ рдЯреБрдХрдбрд╝реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред рд╣рдо рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ I / O рдХреА рд▓рд╛рдЧрдд рдХреЛ рд╣рдЯрд╛ рджреЗрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдпрд╣ рдЙрдбрд╝ рдЬрд╛рддрд╛ рд╣реИ - рд╕рдм рдХреБрдЫ рдЦрд░рд╛рдм рд╣реИред рдмрдбрд╝реЗ HTTP рдкрд╛рд░реНрд╕рд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

$ grep -c '__FSM_STATE\|__FSM_TX\|__FSM_METH_MOVE\|__TFW_HTTP_PARSE_' http_parser.c
520
    7.64% [tempesta_fw]     [k] tfw_http_parse_req
    2.79% [e1000]           [k] e1000_xmit_frame
    2.32% [tempesta_fw]     [k] __tfw_strspn_simd
    2.31% [tempesta_fw]     [k] __tfw_http_msg_add_str_data
    1.60% [tempesta_fw]     [k] __new_pgfrag
    1.58% [kernel]          [k] skb_release_data
    1.55% [tempesta_fw]     [k] __str_grow_tree
    1.41% [kernel]          [k] __inet_lookup_established
    1.35% [tempesta_fw]     [k] tfw_cache_do_action
    1.35% [tempesta_fw]     [k] __tfw_strcmpspn

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдХрд░реЗрдВ?

рдПрдлрдПрд╕рдПрдо рдбрд╛рдпрд░реЗрдХреНрдЯ рд░реЗрдлрд░рд▓


рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рддреЗ рд╣реИрдВ рд╡рд╣ рд▓реВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд▓реЗрдмрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг ( go to) рд╣реИ ред рд░рд╛рдЧреЗрд▓ рдЬреИрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рдкрд╛рд░реНрд╕рд░ рдЬрдирд░реЗрдЯрд░ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВред



рд╣рдо рдЕрдкрдиреЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рд▓реЗрдмрд▓ рдореЗрдВ switchрдФрд░ рдЙрд╕реА рдирд╛рдо рдХреЗ рд╕рд╛рде C рдореЗрдВ рдПрдХ рд▓реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ ред рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдПрдХ рд▓реЗрдмрд▓ рдорд┐рд▓рддрд╛ рд╣реИ switchрдпрд╛ рдХреЛрдб рд╕реЗ рд╕реАрдзреЗ рдЙрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИред рдкрд╣рд▓реА рдмрд╛рд░ рдЬрдм рд╣рдо рдЧреБрдЬрд░рддреЗ рд╣реИрдВ switch, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рд╕реАрдзреЗ рд╡рд╛рдВрдЫрд┐рдд рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред

рдиреБрдХрд╕рд╛рди : рдЬрдм рд╣рдо рдЕрдЧрд▓реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рддреБрд░рдВрдд рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рдбреЗрдЯрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ рд╢реВрдиреНрдп-рдХреЙрдкреА I / O)ред рд╢рд░реАрд░ рдХреА рд╕реНрдерд┐рддрд┐forрдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдПрдХ рдирд┐рдпрдорд┐рдд рд╕реНрд╡рд┐рдЪ-рдЪрд╛рд▓рд┐рдд рдПрдлрдПрд╕рдПрдо рдореЗрдВ рдПрдХ рд╢рд░реНрдд рдХреЗ рдмрдЬрд╛рдп, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд░рд╛рдЬреНрдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЙрдирдореЗрдВ рд╕реЗ 500 рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдХреЛрдб рдмрдирд╛рдирд╛ рдорд╣рд╛рди рдирд╣реАрдВ рд╣реИред

рдмрдбрд╝реА рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, forрдПрдХ рдмрдбрд╝реЗ switchрдЕрдВрджрд░ рдХреЗ рд▓рд┐рдП, рдЬреАрдЯреАрд╕реА рднреА forрдХреЛрдб рдХреЗ рдЕрдВрджрд░ рдХрдИ рдмрд╛рд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ ред рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рдХреЗ

рд╕рд╛рде рдмрджрд▓реЗрдВ switchред рдЕрдЧрд▓рд╛ рдЕрдиреБрдХреВрд▓рди рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ switchрдФрд░ рд╕рд╣реЗрдЬреЗ рдЧрдП рдореЗрдЯрд╛ рдкрддреЗ рдкрд░ рд╕реАрдзреЗ рдЬрдВрдк рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рдЬреИрд╕реЗ рд╣реА рд╣рдо рдлрдВрдХреНрд╢рди рдореЗрдВ рдЖрддреЗ рд╣реИрдВ, рд╣рдо рддреБрд░рдВрдд рд╡рд╛рдВрдЫрд┐рдд рдмрд┐рдВрджреБ рдкрд░ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЬреАрд╕реАрд╕реА рдЖрдкрдХреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред



рдЬреАрд╕реАрд╕реА рдореЗрдВ рдПрдХ рдорд╛рдирдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╣реИ рдЬреЛ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдо рд▓реЗрдмрд▓ рдХрд╛ рдирд╛рдо рд▓реЗрддреЗ рд╣реИрдВ (рдпрд╣рд╛рдВ рдпрд╣ рд╣реИ from) рдФрд░ рдЗрд╕рдХреЗ рдкрддреЗ рдХреЛ рдбрдмрд▓ рдПрдореНрдкрд░рд╕реЗрдВрдб (&&) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рд╕реА-рдЪрд░ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред рдЕрдм рд╣рдо рдбрд╛рдпрд░реЗрдХреНрдЯ рдЬрдВрдк рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВjmpрдХреЗ рд╕рд╛рде рдЗрд╕ рд▓реЗрдмрд▓ рдХрд╛ рдкрддрд╛ gotoред

рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрддрд╛ рд╣реИред

рдкреНрд░рддреНрдпрдХреНрд╖ рд░реВрдкрд╛рдВрддрд░рдг рдкреНрд░рджрд░реНрд╢рди


рд░рд╛рдЬреНрдпреЛрдВ рдХреА рдПрдХ рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рдкрд░, рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рдХреЛрдб рдЬрдирд░реЗрдЯрд░ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИ switchред рд▓реЗрдХрд┐рди рдмрдбрд╝реА рд░рд╛рдЬреНрдп рдорд╢реАрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрддреНрдкрд╛рджрдХрддрд╛ рджреЛрдЧреБрдиреА рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рд░рд╛рдЬреНрдп рдорд╢реАрди рдЫреЛрдЯрд╛ рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИ switchред

$ grep -m 2 'model name\|bugs' /proc/cpuinfo
model name : Intel(R) Core(TM) i7-6500U CPU @ 2.50GHz
bugs       : cpu_meltdown spectre_v1 spectre_v2 spec_store_bypass l1tf

$ gcc --version|head -1
gcc (GCC) 8.2.1 20181105 (Red Hat 8.2.1-5)

States     Switch-driven automaton     Goto-driven automaton
     7     header_line:      139ms     header_line:          156ms
    27     request_line:     210ms     request_line:         186ms
   406     big_header_line: 1406ms     goto_big_header_line: 727ms

рдиреЛрдЯ: Tempesta рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред GitHub рдореЗрдВ рд╕рднреА рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рд╕рдм рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВред рдореВрд▓ рдкрд╛рд░реНрд╕рд░ рдХреЛрдб рд▓рд┐рдВрдХ (рдореБрдЦреНрдп HTTP рдкрд╛рд░реНрд╕рд░) рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, Tempesta FW рдореЗрдВ рдЫреЛрдЯреЗ рдкрд╛рд░реНрд╕рд░ рд╣реИрдВ рдЬреЛ FSM рдХрд╛ рдЖрд╕рд╛рди рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдХреНрдпреЛрдВ рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


рд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ, рд╣рдо рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП (рдЙрдореНрдореАрдж рд╣реИ) рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╢рд╛рдЦрд╛ рдХреЗ рджреБрд░реБрдкрдпреЛрдЧ рд╣реЛрдВрдЧреЗред рдЖрдЗрдП рд╢рд╛рдЦрд╛-рдкреНрд░рдХреНрд╖реЗрдкрд╛рддреНрдордХ рднрд╡рд┐рд╖реНрдпрд╡рд╛рдгреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ" рдХрд░реЗрдВ:

perf record -e branch-misses -g ./http_benchmark
406 states:    switch       - 38% on switch(),
               direct jumps - 13% on header value parsing
			   
7,27 states:   switch       - <18% switch(), up to 40% for()
               direct jumps тАУ up to 46% on header & URI parsing

406 рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рд░рд╛рдЬреНрдп рдорд╢реАрди рдкрд░, рд╣рдо 38% рд╕рдордп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдВрдХреНрд░рдордгреЛрдВ рдореЗрдВ рдмрд┐рддрд╛рддреЗ рд╣реИрдВ switchред рдкреНрд░рддреНрдпрдХреНрд╖ рд╕рдВрдХреНрд░рдордг рд╡рд╛рд▓реЗ рдПрдХ рд░рд╛рдЬреНрдп рдорд╢реАрди рдкрд░, рд╣реЙрдЯрд╕реНрдкреЙрдЯ рд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЕрдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╢рд╛рдорд┐рд▓ рд╣реИ: forрд░рд╛рдЬреНрдп рдорд╢реАрди рдореЗрдВ рд╕реНрдерд┐рддрд┐ switchред

perf stat -e L1-icache-load-misses ./http_benchmark

                       Switch-driven automaton  Goto-driven automaton
big FSM code size:                       29156                  49202
L1-icache-load-misses:                      4M                     2M

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЖрдЗрдП L1 рдирд┐рд░реНрджреЗрд╢ рдХреИрд╢ рдорд┐рд╕ - рджреЛрдиреЛрдВ рдШрдЯрдирд╛рдУрдВ рдХреЗ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рдкреНрд░реЛрдлрд╛рдЗрд▓ рдХреЛ рджреЗрдЦреЗрдВ - рд▓рдЧрднрдЧ 30 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ switchрдФрд░ рд╕реАрдзреЗ рдЬрдВрдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП 50 рдХрд┐рд▓реЛрдмрд╛рдЗрдЯреНрд╕ (рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреИрд╢ рд╕реЗ рдЕрдзрд┐рдХ)ред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдо рдХреИрд╢ рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реА рд╕реНрдЯреЗрдЯ рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХреИрд╢ рдорд┐рд╕ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдирд╣реАрдВ, рд╡реЗ 2 рдЧреБрдирд╛ рдХрдо рд╣реИрдВред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХреИрд╢ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╣рдо рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреБрд░рд╛рдиреЗ рдХреИрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддреЗ рд╣реИрдВред

рд╕рдВрдХрд▓рдХ рдХреЛрдб рдХрд╛ рдХреНрд░рдо рдмрджрд▓рддрд╛ рд╣реИ


рдЬрдм рд╣рдо рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЛрдб рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд░рддреЗ рд╣реИрдВ go to, рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реНрдЯреЗрдЯреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдкрд░ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛: HTTP рддрд░реАрдХрд╛, URI, рдФрд░ рдлрд┐рд░ HTTP рд╣реЗрдбрд░ред рдпрд╣ рддрд░реНрдХрд╕рдВрдЧрдд рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреИрд╢ рдореЗрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдКрдкрд░ рд╕реЗ рдиреАрдЪреЗ, рдЬреИрд╕реЗ рд╣рдо рдбреЗрдЯрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрд▓рдд рд╣реИред рдпрджрд┐ рдЖрдк рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЛрдб рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдЪреАрдЬреЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреАред



рдмрд╛рдИрдВ рдУрд░ рд╣рдордиреЗ рдЬреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХрд┐рдпрд╛ рд╣реИ: рдкрд╣рд▓реЗ рд╣рдо рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддреЗ рд╣реИрдВ GETрдФрд░ POSTрдлрд┐рд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рд╕рдВрднрд╡ рд╡рд┐рдзрд┐ рд╕реЗ рдиреАрдЪреЗ UNLOCKред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ GETрдФрд░ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ POSTрдФрд░ рдлрд┐рд░ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдХрд░рддреЗ рд╣реИрдВ UNLOCKред рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╡рд┐рдкрд░реАрдд рд╣реИ: GETрдордзреНрдп рдореЗрдВ, POSTрдЕрдВрдд рдореЗрдВ рдФрд░ UNLOCKрдКрдкрд░ред

рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рд╕рдордЭ рдирд╣реАрдВ рдЖрддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреИрд╕реЗ рдЖрддрд╛ рд╣реИред рд╡рд╣ рд╕реБрдВрджрд░ рдХреЛрдб рдХреА рдЕрдкрдиреА рддрд╕реНрд╡реАрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдХреНрд░рдо рдореЗрдВ рдХреЛрдб рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рдВрдХрд▓рдХ рдЕрд╡рд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП ред

рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд╛рдзрд╛ рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА рдбрдореА рд╣реИ рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдВрдкрд╛рдЗрд▓рд░ рдлрд┐рд░ рд╕реЗ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдмрд╕ рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рдзрд╛рдУрдВ рдХреЛ рд░рдЦрдХрд░, рд╣рдордиреЗ рдЙрддреНрдкрд╛рджрдХрддрд╛ рдореЗрдВ 4% рддрдХ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ ред

STATE(sw_method) {
    ... // the most frequent states
    MATCH(NGX_HTTP_GET, "GET ");
    MATCH(NGX_HTTP_POST, "POST");
    
    __asm__ __volatile__("": : :"memory");
    ... // many other states
    
    // Improbable states
    METH_MOVE(Req_MethU, 'N', Req_MethUn);
    METH_MOVE(Req_MethUn, 'L', Req_MethUnl);
    METH_MOVE(Req_MethUnl, 'O', Req_MethUnlo);
    METH_MOVE(Req_MethUnlo, 'C', Req_MethUnloc);
    METH_MOVE_finish(Req_MethUnloc, 'K', NGX_HTTP_UNLOCK)

рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рддрд░реАрдХреЗ рд╕реЗ рд▓рд┐рдЦреЗрдВ


рдЪреВрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдбреЗрдЯрд╛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╣рдо рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдЧрд╛рдЗрдбреЗрдб рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди ( рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди) рдХрд░реЗрдВрдЧреЗред рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдЕрдиреБрдХреВрд▓рди (PGO) рдирдореВрдиреЛрдВ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рди рдХрд┐ рдХреЙрд▓реЛрдВ рдХрд╛ рдПрдХ рдХреНрд░рдоред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдпреВрдЖрд░рдЖрдИ рдПрдХ рд╡рд┐рдзрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдирдореВрдиреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд┐рдзрд┐ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдпреВрдЖрд░рдЖрдИ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛрдб рдХреЛ рд╕реНрдерд┐рддрд┐ рджреЗрдЧрд╛ред

рдпрд╣ рдХрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ? рд╣рдо рдХреЛрдб рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЙрд╕ рдкрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдЪрд▓рд╛рдПрдВрдЧреЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдВрдЧреЗ, рдФрд░ рдпрд╣ рд╣рдорд╛рд░реЗ рд▓реЛрдб рдХреЗ рд▓рд┐рдП рдЗрд╖реНрдЯрддрдо рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░реЗрдЧрд╛ред рд▓реЗрдХрд┐рди рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдХреЛрдб рдХреЗ рд╕рдмрд╕реЗ рдЧрд░реНрдо рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдордп рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рдЯреНрд░реИрдХ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рднрд╛рд░ рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдпреВрдЖрд░рдЖрдИ рд╣реИ, рддреЛ рдпрд╣ рд╕рдмрд╕реЗ рдЧрд░реНрдо рд╕реНрдерд╛рди рд╣реЛрдЧрд╛ред URI рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪ рдЬрд╛рдПрдЧрд╛, рдФрд░ PGO рдпрд╣ рдирд╣реАрдВ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рд╣рдореЗрд╢рд╛ URI рд╕реЗ рдкрд╣рд▓реЗ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдкреАрдЬреАрдУ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

Req_Method: {
    if (likely(PI(p) == CHAR4_INT('G', 'E', 'T', ' '))) {
        ...
        goto Req_Uri;
    }
    if (likely(PI(p) == CHAR4_INT('P', 'O', 'S', 'T'))) {
        ...
        goto Req_UriSpace;
    }
    goto Req_Meth_SlowPath;
}
... // other methods: POST, PUT etc.
Req_Uri:
    ... // URI processing
Req_Meth_SlowPath:
...

рдХреНрдпрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?

likely/ unlikely рдореИрдХреНрд░реЛрдЬрд╝ (рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдЬреАрд╕реАрд╕реА рдЗрдВрдЯреНрд░рд┐рдирд┐рдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ __builtin_expect())ред рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕ рдХреЛрдб рдХреЛ рдкрд╛рд╕ рд░рдЦрдирд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЕрдиреБрд░реЛрдз рдирд┐рдХрд╛рдп рддреБрд░рдВрдд рдкреАрдЫреЗ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ifред рдлрд┐рд░ рдХреЛрдб рдХреЛ рдкреНрд░реАрдлрд╝реЗрдЯ рдХрд░рдирд╛ (рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдкреНрд░реАрдлрд╝реЗрдЯ рдХрд░рдирд╛) рдЙрд╕ рдХреЛрдб рдХрд╛ рдЪрдпрди рдХрд░реЗрдЧрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рддреЗрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред



рдЪрд┐рддреНрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреА рд╢реБрд░реБрдЖрдд, рдЕрдВрдд рдФрд░ рдЕрд╡рд░реЛрдз рдХреЛ рджрд░реНрд╢рд╛рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЕрд╡рд░реЛрдз рдХреЗ рдкреАрдЫреЗ рдХреЛрдб рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдереАред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рд╣рдордиреЗ рдПрдХ рдмрд╛рдзрд╛ рдбрд╛рд▓ рджреА рд╣реИред

рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдХрдВрдкрд╛рдЗрд▓рд░ likelyрд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ - рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рд╣рдо рд╕реНрдерд┐рддрд┐ рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдВрдЧреЗ рдФрд░ рд╡рд╣рд╛рдВ рд╣рдо рд▓реЗрдмрд▓ рдкрд░ рдмрд┐рдирд╛ рд╢рд░реНрдд рдХреВрджреЗрдВрдЧреЗReq_Uriред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдХреЗ рдмрд╛рдж рдХрд╛ рдХреЛрдб "рдЧрд░реНрдо рдкрде" рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдХрдВрдкрд╛рдЗрд▓рд░ ifрдЕрд╡рд░реЛрдз рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдХреЛрдб рдХреЛ рд▓реЗрдмрд▓ рдХреЗ рдиреАрдЪреЗ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рд╣реЙрдЯ рдХреЛрдб рдХреА рд╢рд░реНрдд рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред

рдпрд╣ рдирд╣реАрдВ рдерд╛, рдЬреАрд╕реАрд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╣реИ: рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ hotрдФрд░ coldрд▓реЗрдмрд▓ рдХреЗ рд▓рд┐рдПред рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рд▓реЗрдмрд▓ рдЧрд░реНрдо рд╣реИ (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ) рдФрд░ рдЬреЛ рдардВрдбрд╛ рд╣реИ (рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ)ред



рдпрд╣рд╛рдВ рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ GETрдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ POSTрдФрд░ рдЗрд╕реЗ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЫреЛрдбрд╝ рджреЗрдВ likelyред рдЗрд╕ рд╢рд░реНрдд рдХреЗ рддрд╣рдд, рдпреВрдЖрд░рдЖрдИ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдмрдврд╝ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ POSTрдиреАрдЪреЗ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдо рд╕реЗ рдХрдо рд╕рдВрднрд╛рд╡рдирд╛ рд░рд╛рдЬреНрдп рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕рднреА рдХреЛрдб рдиреАрдЪреЗ рд░рд╣рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЗрдмрд▓ рдардВрдбрд╛ рд╣реИред

рдЕрд╕реНрдкрд╖реНрдЯ -рдУ рей


рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВред рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдорди рдореЗрдВ рдЖрддреА рд╣реИ рд╡рд╣ O2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди O3 - рдпрд╣ рддреЗрдЬ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИ - O3 рдХрднреА-рдХрднреА рдмрджрддрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред



O3 рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рд╣реИ ред рдпрджрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ O2 рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдк рдорд┐рд▓рддреЗ рд╣реИрдВ: рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдорджрдж рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреЛрдб рдХреЗ рд▓рд┐рдП, рд╣рдо рдХреЗрд╡рд▓ рдЙрди рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХреЛрдб рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдкрд░рд┐рдгрд╛рдо рдЫреЛрдбрд╝рддреЗ рд╣реИрдВ - рдпрд╣рд╛рдВ 1,838 рдФрд░ 1,858 рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ 1,820 рд╕реЗрдХрдВрдб рд╣реИрдВред

рдХреБрдЫ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рд╣рд░реЗ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдСрдЯреЛ-рд╡реИрд░рд┐рдлрд┐рдХреЗрд╢рди рд╣реИред

Autovectorization


рдЬреАрд╕реАрд╕реА рдЧрд╛рдЗрдб рд╕реЗ рдПрдХ рдЪрдХреНрд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ред

int a[256], b[256], c[256];
void foo () {
    for (int i = 0; i < 256; i++)
        a[i] = b[i] + c[i];
}

рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдЪрд░ рд╕рд░рдгреА рд╣реИ рдЬреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЪрдХреНрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╡реИрдХреНрдЯрд░ рдореЗрдВ рд╡рд┐рдШрдЯрд┐рддред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдСрдЯреЛ- рд╡реЗрдХреНрдЯрд░рд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рддреАрд╕рд░реЗ рд╕реНрддрд░ рдкрд░ рд╕рдХреНрд╖рдо рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ -O3 : GCC рд╡реЗрдХреНрдЯрд░ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рднреА рдХреЛрдб рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡реЗрдХреНрдЯрд░ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рднрд▓реЗ рд╣реА рдпрд╣ рд╕рд┐рджреНрдзрд╛рдВрдд рдореЗрдВ рд╡реЗрдХреНрдЯрд░рдХреГрдд рд╣реЛ)ред

рд╣рдо рдЬреАрд╕реАрд╕реА рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ -fopt-info-vec-all, рдЬреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡реЗрдХреНрдЯрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рд╕рджрд┐рд╢ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдб рдЕрднреА рднреА рдмрджрддрд░ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╡реИрд╢реНрд╡реАрдХрд░рдг рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ: рдХрднреА-рдХрднреА рдпрд╣ рдХреЛрдб рдХреЛ рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╣рдо рд╣рдореЗрд╢рд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗрдХреНрдЯрд░рдХреГрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╡реИрд╢реНрд╡реАрдХрд░рдг рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВред

рд╕рдВрд░реЗрдЦрдг: рдЬреАрдИрдЯреА рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рддреБрд▓рдирд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ?


рд╣рдо рдПрдХ рдЫреЛрдЯреА рд╕реА рд╣реИрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдиреЗрдЧрдиреЗрдХреНрд╕ рдореЗрдВ: рд╣рдо рдмрд╛рдЗрдЯреНрд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдкрд╛рд░реНрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди intрдЙрдирдХреЗ рд╕рд╛рде рд▓рд╛рдЗрдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдФрд░ рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред

#define CHAR4_INT(a, b, c, d)    ((d << 24) | (c << 16) | (b << 8) | a)
if (p == CHAR4_INT('G', 'E', 'T', ' ')))
    // we have GET as method

рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрджрд┐ рдЗрд╕реЗ intрд╕рдВрд░реЗрдЦрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ 2-3 рдмрд╛рд░ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдордиреЗ рдПрдХ рдЫреЛрдЯрд╛ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд▓рд┐рдЦрд╛, рдЬреЛ рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИред

$ ./int_align
Unaligned access = 6.20482
Aligned access = 2.87012
Read four bytes = 2.45249

рдлрд┐рд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ intред рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ, рдпрджрд┐ рдкрддрд╛ intрд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рддреБрд▓рдирд╛ рдХрд░реЗрдВ int, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдмрд╛рдЗрдЯреНрд╕ред

 (((long)(p) & 3)
  ? ((unsigned int)((p)[0]) | ((unsigned int)((p)[1]) << 8)
  | ((unsigned int)((p)[2]) << 16) | ((unsigned int)((p)[3]) << 24))
  : *(unsigned int *)(p));

рд▓реЗрдХрд┐рди рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрджрддрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

full request line:     no difference
method only:           unaligned      - 214ms
                       aligned        - 231ms
                       bytes          - 216ms

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ: рдкреГрдердХ, рдЧреИрд░-рдЖрд╢рд╛рд╡рд╛рджреА, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЛрдб рдФрд░ рдЗрдирд▓рд╛рдЗрди рдкрд╛рд░реНрд╕рд░ рдХреЛрдб рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рдХреА рдмрдбрд╝реА рдорд╛рддреНрд░рд╛ рдХреЗ рдХрд╛рд░рдг рдЕрдкрдирд╛ рдЕрдиреБрдХреВрд▓рди рдЦреЛ рджреЗрддрд╛ рд╣реИред рдкреНрд░реЛрдлрд╛рдЗрд▓рд┐рдВрдЧ рдореЗрдВ рдХреЛрдИ рдЬреБрд░реНрдорд╛рдирд╛ рдирд╣реАрдВ рдерд╛ред

рдиреЛрдЯ: рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдореЗрдВ рдХреНрдпреЛрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЗрд╕рдХреА рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ GitHub рдкрд░ рдкрдврд╝реА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред

HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИрдВ?


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдпреВрдЖрд░рдЖрдИ рд╣реИ:



рдпрджрд┐ рдЖрдк рд╣реЛрдЯрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреБрдХрд┐рдВрдЧ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХреБрдЫ рдлрд╝рд┐рд▓реНрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ, рдПрдХ рдХрд┐рд▓реЛрдмрд╛рдЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛ рдпреВрдЖрд░рдЖрдИ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред

Nginx рдореЗрдВ рдПрдХ рдХрд╛рдлреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдорд╢реАрди рд╣реИ switch/ caseред рдпрд╣ рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреЗрдореНрдкреЗрд╕реНрдЯрд╛ рдПрдлрдбрдмреНрд▓реНрдпреВ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ рди рдХреЗрд╡рд▓ рдпреВрдЖрд░рдЖрдИ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рднреА рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рд╣реЛрдЧреАред

case sw_check_uri:
    if (usual[ch >> 5] & (1U << (ch & 0x1f)))
        break;
    switch (ch) {
    case '/':
        r->uri_ext = NULL;
        state = sw_after_slash_in_uri;
        break;
    case '.':
        r->uri_ext = p + 1;
        break;
    case ' ':
        r->uri_end = p;
        state = sw_check_uri_http_09;
        break;
    case CR:
        r->uri_end = p;
        r->http_minor = 9;
        state = sw_almost_done;
        break;
    case LF:
        r->uri_end = p;
        r->http_minor = 9;
        goto done;
    case '%':
    r->quoted_uri = 1;
    ...

рдПрдХ рдФрд░ URI: /redir_lang.jsp?lang=foobar%0d%0aContent-Length :
%200%0d% 0a% 0d% 0aHTTP / 1.1% 20200% 20200% 20d% 0d% 0aContent-Type:% 20text /
html% 0d% 0aContent -Length:% 2019% 0d% 0a% 0d% 0aShazam </
html>ред

рдпрд╣ рдкрд╣рд▓реЗ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдЗрдВрдЬреЗрдХреНрд╢рди рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рдиреА рд╣реЛрдЧреАред

рдЪрд▓реЛ рдПрдХ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВ : рдкрд╣рд▓реЗ рдпреВрдЖрд░рдЖрдИ рд▓реЗрдВ, рдХреБрд▓реНрд╣рд╛рдбрд╝реА рдЦрд┐рд▓рд╛рдПрдВ, рдЗрд╕реЗ рдирдВрдЧреЗрдХреНрд╕ рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдирдЧреНрдиреЗрдХреНрд╕ рдмрд╣реБрдд рдЧрд░реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред



рдпрджрд┐ рдкрд┐рдЫрд▓реЗ рдирд┐рдпрдорд┐рдд рд╕реВрдЪрдХрд╛рдВрдХ рдХреНрд╡реЗрд░реА рдкрд░ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдкрд╛рд░реНрд╕рд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реАрд░реНрд╖ рдкрд░ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рдпрд╣ рдФрд░ рднреА рдЧрд░реНрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

8.62%  nginx         [.] ngx_http_parse_request_line
2.52%  nginx         [.] ngx_http_parse_header_line
1.42%  nginx         [.] ngx_palloc
0.90%  [kernel]      [k] copy_user_enhanced_fast_string
0.85%  nginx         [.] ngx_strstrn
0.78%  libc-2.24.so  [.] _int_malloc
0.69%  nginx         [.] ngx_hash_find
0.66%  [kernel]      [k] tcp_recvmsg

HTTP рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдЦрд╛рд╕ рд╣реИ? рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рднрд╛рдЬрдХ ' : 'рдФрд░ рд╣реИрдВ ' , ', рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдЕрдВрдд, рдЬреЛ рдпрд╛ рддреЛ рдбрдмрд▓-рдмрд╛рдЗрдЯ \r\nрдпрд╛ рд╕рд┐рдВрдЧрд▓-рдмрд╛рдЗрдЯ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ \n, рдЬрд┐рд╕рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЧрдИ рдереАред рд╕реА-рд▓рд╛рдЗрдиреНрд╕ рдХреА рдХреЛрдИ 0-рд╕рдорд╛рдкреНрддрд┐ рдирд╣реАрдВ рд╣реИ - рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рд╣рдо рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рдЬрд╛рдБрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдЖрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдорд╛рдирдХ рдХрд╛рд░реНрдп рд╣реИрдВ рдЬреЛ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред

  • strspn: рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╡рд░реНрдг, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╡реИрдз рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд╕рдВрдХрд▓рди рдХреЗ рдЪрд░рдг рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
  • strcasecmp()ред рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдорд╛рдорд▓реЗ рдХреА рдХреЛрдИ рдЬрд░реВрд░рдд рдирд╣реАрдВ рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ xрдХреЗ рд╕рд╛рде Foo:ред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ strcasecmp(), рдХреЗрд╡рд▓ рдЕрдиреБрдкрд╛рд▓рди / рдЧреИрд░-рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ , рдФрд░ рдЖрдкрдХреЛ рд▓рд╛рдЗрди рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рд╡реЗ рдзреАрд░реЗ-рдзреАрд░реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдорд╛рдирджрдВрдб рджреЗрдЦреЗрдВ рдФрд░ рд╕рдордЭреЗрдВ рдХрд┐ рдЙрдирдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИред

рддреНрд╡рд░рд┐рдд рдкрд╛рд░реНрд╕рд░


рдХрдИ рдкрд╛рд░реНрд╕рд░реНрд╕ рд╣реИрдВред

рдирдЧреНрдиреЗрдХреНрд╕ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдкрд╛рд░реНрд╕рд░, рдкрд╛рд░реНрд╕рд░ рд╣реИред рдпрд╣ RFC рдЕрдиреБрдкрд╛рд▓рди рдХреА рд╕рдЦреНрддреА рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред PicoHTTPParser (H2O) рдФрд░ Cloudflare рдкрд╛рд░реНрд╕рд░ рднреА рд╣реИрдВред рд╡реЗ рдбреЗрдЯрд╛ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрди рд╡рд░реНрдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ RFC рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИред

PCMESTRIред рдкрд╛рд░реНрд╕рд░реНрд╕ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдкрд╣рд▓рд╛ PCMESTRI рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд┐рдХреЛ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдо рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдо рдпрд╛ рддреЛ 16 рд╡рд░реНрдг рдпрд╛ 8 рд╢реНрд░реЗрдгреА рд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рд╕реАрдорд╛ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╡рд░реНрдг рд╣реЛрддрд╛ рд╣реИ - рдмрд╕ рджреЛрд╣рд░рд╛рдПрдВред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдХрд╛рд░рдг, рдкрд┐рдХреЛ рдкрд╛рд░реНрд╕рд░ рдЖрд░рдПрдлрд╕реА рдЕрдиреБрдкрд╛рд▓рди рдХрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рддреНрдпрд╛рдкрди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ рдЖрд░рдПрдлрд╕реА рдХреА 8 рд╕реЗ рдЕрдзрд┐рдХ рд╢реНрд░реЗрдгрд┐рдпрд╛рдВ рд╣реИрдВред


рд╣рдо рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреЛ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ, рдирд┐рд░реНрджреЗрд╢ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░, рд╣рдо рдЬрд▓реНрджреА рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрдпреЛрдЧ рд╣реИ рдпрд╛ рдирд╣реАрдВред

AVX2 - рдХреНрд▓рд╛рдЙрдбрдлрд╝реЗрдпрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдгред CloudXlare parser, AVX2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдПрдХ рдкрд┐рдХреЛ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕рд╛рде 16 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдмрд╛рд░ рдореЗрдВ рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ 32 рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред CloudFlare рдореЗрдВ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдмреЗрд╣рддрд░ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕реЗ AVX2 рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред



рд╣рдо ASCII рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рд╕рднреА рд╡рд░реНрдгреЛрдВ рдХреЛ рдПрдХ рд╕реНрдерд╛рди рдкрд░ рдЬрд╛рдБрдЪрддреЗ рд╣реИрдВ, рд╕рднреА рд╡рд░реНрдг 128 рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рдХреА рд╕реАрдорд╛ рд▓реЗрддреЗ рд╣реИрдВред рд╕рд░рд▓ рдХреЛрдб рддреЗрдЬ рд╣реИред

PCMESTRI рдФрд░ AVX2 рдХреА рддреБрд▓рдирд╛ рдХрд░реЗрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рд╕реАрдорд╛ 1500 рд╣реИред рдпрд╣ рдЕрдзрд┐рдХрддрдо рдкреИрдХреЗрдЬ рдЖрдХрд╛рд░ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИред рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рдкрд░ AVX2 рдХреЛрдб рдкрд┐рдХреЛ рдкрд╛рд░реНрд╕рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЫреЛрдЯреЗ рдбреЗрдЯрд╛ рдкрд░ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ AVX2 рдореЗрдВ рдирд┐рд░реНрджреЗрд╢ рднрд╛рд░реА рд╣реЛрддреЗ рд╣реИрдВред


рдЙрд╕рдХреА рддреБрд▓рдирд╛ рдореЗрдВstrspnред рдпрджрд┐ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓реЗрддреЗ рд╣реИрдВ strspn, рддреЛ рдЪреАрдЬреЗрдВ рдЦрд░рд╛рдм рд╣реЛ рдЬрд╛рддреА рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдмрдбрд╝реЗ рдбреЗрдЯрд╛ рдкрд░ред "рдореБрдХрд╛рдмрд▓рд╛" рдореЗрдВ рдкрд╛рд░реНрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ strspnред


Tempesta рдорд┐рд▓рд╛рди рддреЗрдЬ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реИ


рд╣рдорд╛рд░реА рдЧрддрд┐ рдкрд╛рд░реНрд╕рд░ рдЗрди рджреЛрдиреЛрдВ рдХреА рддрд░рд╣ рд╣реИред рдЫреЛрдЯреЗ рдЖрдВрдХрдбрд╝реЛрдВ рдкрд░, рдпрд╣ рдкрд┐рдХреЛ рдкрд╛рд░реНрд╕рд░ рдЬрд┐рддрдирд╛ рддреЗрдЬрд╝ рд╣реИ, рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ - рдЬреИрд╕реЗ рдХреНрд▓рд╛рдЙрдбрдлрд╝реНрд▓реЗрдпрд░ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдЕрдорд╛рдиреНрдп рд╡рд░реНрдгреЛрдВ рдХреЛ рдирд╣реАрдВ рдЫреЛрдбрд╝рддрд╛ рд╣реИред



рдкрд╛рд░реНрд╕рд░ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреИрд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ? рд╣рдо, nginx рдХреЗ рд░реВрдк рдореЗрдВ, рдмрд╛рдЗрдЯреНрд╕ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд╣реИред рдпрд╣рд╛рдВ рд╣рдо рдХреЗрд╡рд▓ рдЫреЛрдЯреА рд╢рд░реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ likelyрдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╢рд╛рдЦрд╛ рдЧрд▓рддрдлрд╣рдореА рд▓рдВрдмреЗ рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯреА рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рджрд░реНрджрдирд╛рдХ рд╣реИред рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЛ рд▓реЗрддреЗ рд╣реИрдВред рдЕрдВрддрд┐рдо рдкрдВрдХреНрддрд┐ рдХреЗ рдХрд╛рд░рдг рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 4 рдХреА рд╕реАрдорд╛ рд╣реИ - рд╣рдореЗрдВ рдПрдХ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕реНрдерд┐рддрд┐ рд▓рд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рд╣рдо 4 рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдерд┐рддрд┐ рдХрдард┐рди рд╣реЛрдЧреА рдФрд░ рдХреЛрдб рдзреАрдорд╛ рд╣реЛрдЧрд╛ред

static const unsigned char uri_a[] __attribute__((aligned(64))) = {
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
        ...
        // Branch misprediction is more crucial for short strings
        if (likely(len <= 4)) {
                switch (len) {
                case 0:
                    return 0;
                case 4:
                    c3 = uri_a[s[3]];
                    // fall through to process other chars
                case 3:
                    c2 = uri_a[s[2]];
                case 2:
                    c1 = uri_a[s[1]];
                case 1:
                    c0 = uri_a[s[0]];
                }
                return (c0 & c1) == 0 ? c0 : 2 + (c2 ? c2 + c3 : 0);
        }

рдореБрдЦреНрдп рдкрд╛рд╢ рдФрд░ рдмрдбрд╝реА рдкреВрдВрдЫред рдореБрдЦреНрдп рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдЪрдХреНрд░ рдореЗрдВ, рд╣рдо рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рдпрджрд┐ рдпрд╣ рдХрд╛рдлреА рд▓рдВрдмрд╛ рд╣реИ, рддреЛ рд╣рдо 128, 64, 32 рдпрд╛ 16 рдмрд╛рдЗрдЯреНрд╕ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ 128 рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ: рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ, рд╣рдо рдХрдИ рдкреНрд░реЛрд╕реЗрд╕рд░ рдЪреИрдирд▓ (рдХрдИ рдкрд╛рдЗрдкрд▓рд╛рдЗрди) рдФрд░ рдПрдХ рд╕реБрдкрд░рд╕реНрдХреНрд▓реЗрдпрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

for ( ; unlikely(s + 128 <= end); s += 128) {
        n = match_symbols_mask128_c(__C.URI_BM, s);
        if (n < 128)
                return s - (unsigned char *)str + n;
}

if (unlikely(s + 64 <= end)) {
        n = match_symbols_mask64_c(__C.URI_BM, s);
        if (n < 64)
                return s - (unsigned char *)str + n;
        s += 64;
}

if (unlikely(s + 32 <= end)) {
        n = match_symbols_mask32_c(__C.URI_BM, s);
        if (n < 32)
                return s - (unsigned char *)str + n;
        s += 32;
}

if (unlikely(s + 16 <= end)) {
        n = match_symbols_mask16_c(__C.URI_BM128, s);
        if (n < 16)
                return s - (unsigned char *)str + n;
        s += 16;
}

рдкреВрдВрдЫред рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЕрдВрдд рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 16 рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдХрдо рд╣реИ, рддреЛ рд╣рдо рдПрдХ рд▓реВрдк рдореЗрдВ 4 рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЕрдВрдд рдореЗрдВ 3 рдмрд╛рдЗрдЯреНрд╕ рдирд╣реАрдВред

while (s + 4 <= end) {
        c0 = uri_a[s[0]];
        c1 = uri_a[s[1]];
        c2 = uri_a[s[2]];
        c3 = uri_a[s[3]];
        if (!(c0 & c1 & c2 & c3)) {
                n = s - (unsigned char *)str;
                return !(c0 & c1) ? n + c0 : n + 2 + (c2 ? c2 + c3 : 0);
        }
        s += 4;
}

c0 = c1 = c2 = 0;
switch (end - s) {
        case 3:
                c2 = uri_a[s[2]];
        case 2:
                c1 = uri_a[s[1]];
        case 1:
                c0 = uri_a[s[0]];
}

n = s - (unsigned char *)str;
return !(c0 & c1) ? n + c0 : n + 2 + c2;

рд╣рдо рдмрд┐рдЯ рдорд╛рд╕реНрдХ рдФрд░ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ - рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдореБрдЦреНрдп рд╢рд░реАрд░ рдХрд╛ рдореБрдЦреНрдп рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рд╣реИред рд╣рдо 16 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ 8 рдХреЙрд▓рдореЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ ASCII рддрд╛рд▓рд┐рдХрд╛ (рдЪрд┐рддреНрд░ рдореЗрдВ) рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЕрдкрдиреА рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ BM URI рдХреЗ рдкрд╣рд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдПрдиреНрдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ: рдкрд╣рд▓реА рдФрд░ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ред



рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рддреАрдХ рдЬреЛ рд╣рдо рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ рд╡реЗ рд╣реИрдВ 0 @ P pрдФрд░ 2 B R q Rред рд╡реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЗрдирдХреЛрдб: b8 = inv(1011 1000) = 0 @ P p, f8 = inv(1111 1000) = 2 B R q Rред

рд╣рдо рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рдПрдирдХреЛрдб рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо 0 рдкрд░ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд┐рд╕ рдХреИрд░реЗрдХреНрдЯрд░ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рдпреВрдирд┐рдЯреНрд╕ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред

ASCII рдмрд┐рдЯ рдорд╛рд╕реНрдХ рд╕реЗрдЯ рдХрд░реЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд░реЗрдЦрд╛ рдЖрддреА рд╣реИ "pr": рдкрд╣рд▓реА рдкрдВрдХреНрддрд┐ рд╕реЗ рдкрд╣рд▓рд╛ рд╡рд░реНрдг ASCII рд╣реИ, рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ рд╕реЗ рджреВрд╕рд░реА рдкрдВрдХреНрддрд┐ред рд╣рдо рдлреЗрд░рдмрджрд▓ рдмрдпрд╛рди рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдирдкреБрдЯ рдореЗрдВ рдЗрди рд╡рд░реНрдгреЛрдВ рдХреЗ рдХреНрд░рдо рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╣рдорд╛рд░реА рдПрдиреНрдХреЛрдбреЗрдб рддрд╛рд▓рд┐рдХрд╛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдлреЗрд░рдмрджрд▓ рдХрд░рддрд╛ рд╣реИред



рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдо рдЖрдИрдбреАред рдЕрдЧрд▓рд╛, рд╣рдо ASCII рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдХреЙрд▓рдо рдХреЛ рдПрдХ рдЕрд▓рдЧ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВред рдлрд┐рд░ рд╣рдо рдХреЙрд▓рдо рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ "рдХреНрд░реЙрд╕" рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рдкрддреНрд░рд╛рдЪрд╛рд░ рдорд┐рд▓рддрд╛ рд╣реИ: рд╣рдорд╛рд░рд╛ рдЪрд░рд┐рддреНрд░ рдпрд╛ рдирд╣реАрдВред

рдЪреВрдВрдХрд┐ рдХреЙрд▓рдо рдмрд╛рдЗрдЯ рд╕реЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг 4 рдмрд┐рдЯреНрд╕ рд╣реИрдВ, рд╣рдо рдмрд╛рдИрдВ рдУрд░ рд╢рд┐рдлреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдПрд╡реАрдПрдХреНрд╕ рдореЗрдВ рдХреЗрд╡рд▓ 2 рдмрд╛рдЗрдЯреНрд╕ рдХреА рднрд░рдкрд╛рдИ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реЗ рдмрд╛рдЗрдЯ рдХреЛ рд╢рд┐рдлреНрдЯ рдХрд░реЗрдВ, рдлрд┐рд░ рд╣рдорд╛рд░реЗ рдорд╛рд╕реНрдХ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред



ASCII рдХреЙрд▓рдо рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдирд╛ рджреВрд╕рд░рд╛ рдлреЗрд░рдмрджрд▓ рдЪрд▓рд╛рдПрдБ, рдХреЙрд▓рдо рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдкрджреЛрдВ рдкрд░ рд▓реЗ рдЬрд╛рдПрдБред рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЕрдВрддрд┐рдо рдХреЙрд▓рдо рд╕реЗ рдЗрдирдкреБрдЯ рдмрд╛рдЗрдЯ, рдЗрд╕рд▓рд┐рдП рдкрд╣рд▓реА рдФрд░ рджреВрд╕рд░реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣рдореЗрдВ рдПрдХ рд╣реА рдХреЙрд▓рдо рдорд┐рд▓рддрд╛ рд╣реИред



рд╕реНрддрдВрднреЛрдВ рдФрд░ рдореБрдЦреМрдЯреЗ рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЕрдВрддрд░ ред рд╣рдо and(рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдХреЙрд▓рдо рдХреЛ "рдХреНрд░реЙрд╕" рдХрд░рддреЗ рд╣реИрдВ) рдФрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рд╡реИрдз рд╣реИ - рдкрд░рд┐рдгрд╛рдоandрд╕реНрддрдВрднреЛрдВ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╕реЗ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИред



рдЕрдВрдд рдореЗрдВ рд╢реВрдиреНрдп рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдиреЗрдВред рд╣рдо рдЗрд╕реЗ рд╡реЗрдХреНрдЯрд░ рд╕реЗ рд╕рднреА рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рддреЗ рд╣реИрдВ intрдФрд░ рдЗрд╕реЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ - рдХрд╛рдлреА рд╕рд░рд▓ рд░реВрдк рд╕реЗред



рдЕрдХреНрд╖рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВред ASCII рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдкрд░, рд╣рдореЗрдВ рдПрдХ рд╕рд╕реНрддреА рд╕реБрд╡рд┐рдзрд╛ рдорд┐рд▓рддреА рд╣реИ: рд╣рдо рд╕реНрдереИрддрд┐рдХ рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рд╣рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣ рдкреВрдЫрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдХрд┐ URI, рд╡рд┐рднрд┐рдиреНрди рд╣реЗрдбрд░ рдХреЗ рдирд╛рдо рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдЙрдкрд▓рдмреНрдз рд╣реИред HTTP URI рдЕрдиреБрд░реЛрдз рдФрд░ рд╢реАрд░реНрд╖ рд▓реЗрдЦ рдПрдХ HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП 8 рдЕрдХреНрд╖рд░ (рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрди рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдХреЛ рдПрдХ рд╣реА рдХреЛрдб рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХрд▓ рд╡рд░реНрдгрдорд╛рд▓рд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рд╡реИрдз рдпреВрдЖрд░рдЖрдИ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдпрд╣ рдЕрд▓рдЧ рд╣реИред

рдЖрдХреНрд░рдордг


рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЬрдм рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

BlackHat'17 (" SSRF рдХрд╛ рдПрдХ рдирдпрд╛ рдпреБрдЧ") рдХреЗ рд╕рд╛рде SSRF рд╣рдорд▓рд╛ : http://foo@evil.com:80@google.com/- рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдПрдореНрдкрд░рд╕реЗрдВрдб рдкреНрд░рддреАрдХред рдХреБрдЫ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреБрдЫ рдореЗрдВ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ рд╡реИрдз рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд▓реЗ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЖрд░рд╕реАрдИ-рд╣рдорд▓рд╛: ┬лрдкреНрд░рднрд╛рд╡реА рдкреНрд░рджрд░реНрд╢рди рдЗрдВрдЬреЗрдХреНрд╢рди рдЗрдВрдЬреЗрдХреНрд╢рди рдХреА рддрд░рд╣ рд╣реИ┬╗, BSides'16 User-Agent: ...;echo NAELBD$((26+58))$echo(echo NAELBD)NAELBD...:ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдПрдХ рд╕реНрдерд┐рд░ рд╣реЗрдбрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЖрд░рд╕реАрдИ рдХреЗ рд╣рдорд▓реЗ рдХреЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрдм рдХреБрдЫ shellрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдХреЗ рд▓рд┐рдП atypical рд╡рд░реНрдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ ред рд╣рдо рдбреЙрд▓рд░ рдЪрд┐рдиреНрд╣ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдЦреБрдж рдХреА рд░рдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред

рд╕рд╛рдкреЗрдХреНрд╖ рдкрде рдУрд╡рд░рд░рд╛рдЗрдЯ ред рдЖрдЦрд┐рд░реА рдорд╛рдорд▓рд╛ 2016 рдореЗрдВ Google рдХрд╛ рд╣реИред рдШреБрдВрдШрд░рд╛рд▓реЗ рдмреНрд░реЗрд╕рд┐рдЬрд╝, рдХреЙрд▓реЛрди, рдпреВрдЖрд░рдЖрдИ рдореЗрдВ рдЖрдП .../gallery?q=%0a{}*{background:red}/..//apis/howto_guide.htmlред рдпреЗ рдЕрдпреЛрдЧреНрдп рд╡рд░реНрдг рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╡рд░реНрдгрдорд╛рд▓рд╛ рд╕реЗ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реНрдЯреНрд░реИрд╕реЗрдХрдореНрдк ()


рдпрд╣ рдХрд╛рдлреА рддреБрдЪреНрдЫ рдХреЛрдб рд╣реИред рд╣рдо 32 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рддрд╛рд░ рдХреА рддреБрд▓рдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рджреЛ рд╕рд░рдгрд┐рдпрд╛рдБ рд╣реИрдВред

__m256i CASE = _mm256_set1_epi8(0x20);

// HackerтАЩs Delight for signed comparison: -0x80 for both operands
__m256i A = _mm256_set1_epi8('A' тАУ 0x80);
__m256i D = _mm256_set1_epi8('Z' - 'A' + 1 тАУ 0x80);

// HackerтАЩs Delight: 'a' <= v <= 'z' to
// v - ('a' тАУ 0x80) < 'z' - 'a' + 1 - 0x80
__m256i sub = _mm256_sub_epi8(str1, A);
__m256i cmp_r = _mm256_cmpgt_epi8(D, sub);
__m256i lc = _mm256_and_si256(cmp_r, CASE);
__m256i vl = _mm256_or_si256(str1, lc);
__m256i eq = _mm256_cmpeq_epi8(vl, str2);
return ~_mm256_movemask_epi8(eq);

рд╣рдо рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рджреЗрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЗ рдореЗрдВ рд╣рдордиреЗ рдирд┐рдЪрд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдорд╛рд░реЗ рдкрд╛рд░реНрд╕рд░ рдореЗрдВ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреЛ рдХреНрд░рдорд╛рджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреБрд▓рдирд╛рдПрдВ рд╣реИрдВ, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рдЗрдЯ (рд╣реИрдХрд░ рдбрд┐рд▓рд╛рдЗрдЯ рд╕реЗ рдПрдХ рдЪрд╛рд▓) рд╕реЗ 128 рдШрдЯрд╛рддреЗ рд╣реИрдВред

рд╣рдо рдПрдХ рд╡реИрдз рдЪрд░рд┐рддреНрд░ рдХреА рд╕реАрдорд╛ рдХреА рддреБрд▓рдирд╛ рднреА рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдЗрд╕ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкрдВрдЬреАрдХрд░рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдкрддреНрд░ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдЗрд╕реЗ рдЪреЗрдХ рдХрд░рдиреЗ рдХреЗ рд╕рдордп, рдПрдХ z рд╕реЗ рджреЛ рддреБрд▓рдирд╛ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рддреБрд▓рдирд╛ (рд╣реИрдХрд░ рдбрд┐рд▓рд╛рдЗрдЯ рд╕реЗ рдПрдХ рдЪрд╛рд▓) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рд╕реНрдерд┐рд░ рдкрд░ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рджрд░реНрд╢рди strcasecmp ()


Tempesta GLIBC рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬ рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг (18 рдпрд╛ 19) рднреАред рдХреЛрдб strcasecmp()AVX рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдирд╣реАрдВред AVX2 рддреЗрдЬ рд╣реИ, рдЗрд╕рд▓рд┐рдП Tempesta рдореЗрдВ рддреЗрдЬ рдХреЛрдб рд╣реИред



рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ FPU


рд╣рдо рд╡реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╡реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╡реЗрдХреНрдЯрд░ рдирд┐рд░реНрджреЗрд╢ рдПрдлрдкреАрдпреВ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЦреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдирд╣реАрдВ рд╣реИ, рдореБрдЦреНрдп рд░рдЬрд┐рд╕реНрдЯрд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╛рдлреА рдмрдбрд╝рд╛ рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд▓рд┐рдирдХреНрд╕ рдореЗрдВ рдЕрдиреБрдХреВрд▓рди рд╣реИред рдпрджрд┐ рд╣рдо рдХрд░реНрдиреЗрд▓ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо FPU рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ (XMM, YMM, ZMM) рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдирд╣реАрдВ рдмрдЪрд╛рддреЗ рд╣реИрдВ: рд╣рдо рдореБрдЦреНрдп рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдХреЗ рдХреЗрд╡рд▓ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдУрдПрд╕ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рд╡реЗрдХреНрдЯрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреА рдЬрд░реВрд░рдд рд╣реИ fpu_beginрдФрд░ fpu_endрдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдлрдкреАрдпреВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреЗ рд╕рдВрджрд░реНрдн рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

__kernel_fpu_begin_bh();
memcpy_avx(dst, src, n);
__kernel_fpu_end_bh();

рдпреЗ рдореВрд▓ рдореИрдХреНрд░реЛ рд╣реИрдВ рдЬреЛ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбреНрдпреВрд▓ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ , рдЬреЛ рд╡реЗрдХреНрдЯрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпреЗ рдХрд╛рдлреА рдзреАрдореЗ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВред

рдПрд╡реАрдПрдХреНрд╕ рдФрд░ рдПрд╕.рдПрд╕.рдИ.


рдПрдлрдкреАрдпреВ рд╕рдВрджрд░реНрдн рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдмрд╣рд╛рд▓ рдХрд░рдиреЗ рдХреЗ рдорд╛рдирджрдВрдб рд╕реЗ рдкрд╣рд▓реЗ, рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╢рдмреНрджред рдХрднреА-рдХрднреА рдпрд╣ рдХреЛрдбрд╛рдВрддрд░рдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ? рдХрднреА-рдХрднреА рдЬреАрд╕реАрд╕реА рдЙрдк-рдЕрдкрдирд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЙрдбрд▓ рдкрд░, рдПрд╕рдПрд╕рдИ рд╕реЗ рдПрд╡реАрдПрдХреНрд╕ рддрдХ рд╕рдВрдХреНрд░рдордг рд╕реЗ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЬреБрд░реНрдорд╛рдирд╛ рд╣реИред рдЬреАрд╕реАрд╕реА рдХреЗ рдкрд╛рд╕ рдПрдХ рдирдИ рдХреБрдВрдЬреА рд╣реИ vzeroupper- рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдЙрддреНрдкрдиреНрди рди рдХрд░реЗрдВ vzeroupper, рдЬреЛ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдЬреБрд░реНрдорд╛рдирд╛ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред

рдЖрдкрдХреЛ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рддрднреА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рдЖрдк рдкреБрд░рд╛рдиреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рдЬреЛ рдХрд┐ рдХрд┐рд╕реА рддреАрд╕рд░реЗ рдкрдХреНрд╖ рджреНрд╡рд╛рд░рд╛ SSE рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╣рдо рдЗрди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВред

рдПрдлрдкреАрдпреВ


рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдСрдЯреЛ-рд╡реИрд░рд┐рдлрд┐рдХреЗрд╢рди рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдпреВрдЬрд░ рд╕реНрдкреЗрд╕ рдХреЛрдб рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдСрдкрд░реЗрд╢рди рд╣реЛрдВрдЧреЗред



рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреЛрдИ рднреА рджреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╡реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВред рдЬрдм рдЖрдкрдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реНрдиреЗрд▓ рдФрд░ рд╡рд╛рдкрд╕ рдЬрд╛рддреА рд╣реИ, рддреЛ рдЖрдк рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рд╡реЗрдХреНрдЯрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рджреВрд╕рд░реЗ (рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ) рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдХреЗ рдХреИрд╢ рд╡рд╣рд╛рдВ рдЕрдХреНрд╖рдо рд╣реИрдВ, рдПрдлрдкреАрдпреВ рд╢реБрд░реВ / рдЕрдВрдд рдкрд░ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдореЙрдбреНрдпреВрд▓ рднреА рдЦрд░рд╛рдм рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдСрдкрд░реЗрд╢рди рдХрд╛рдлреА рдорд╣рдВрдЧрд╛ рд╣реИ - рдПрдХ рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдорд╛рд░реНрдХред

рдорд╛рдЗрдХреНрд░реЛрдмреЗрдирдЪрд░реНрдЪ рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╣рдореЗрд╢рд╛ рдирд╛рдЯрдХреАрдп рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрд╢рди рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдореЗрдВ, рд╕рдВрджрд░реНрдн рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред рдХрд░реНрдиреЗрд▓ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреЗрдЬрд╝ рд╣реИред рд╣рдо рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рдкрд░реНрдпрд╛рдкреНрдд рдмрдбрд╝реЗ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рд╡реЗрдХреНрдЯрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред

Intelpocalypse


рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрд╡рд┐рдЪ рдХреЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓ рд╡рд┐рдХрд▓реНрдк рджрд┐рдЦрд╛рдпрд╛: рдПрдХ рд▓рдВрдмреА рдкреНрд░рдХреНрд░рд┐рдпрд╛, рдПрдирдо, рд╕реНрд╡рд┐рдЪ рддрд╛рд▓рд┐рдХрд╛ рдХреЛ рдПрдХ рд╕рд░рдгреА рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рд╕рд░рдгреА рдкрд░ рдХреВрджрдиреЗ рд╡рд╛рд▓реЗ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рдбрдмрд▓ рдбреЗрд░реЗрдлреЗрд░рд┐рдВрдЧ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдпрд╣ рд╕реНрдкреЗрдХреНрдЯрд░ рд╣рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рджреГрд╢реНрдп рд╣реИ рдЬреЛ рд╕рдЯреНрдЯрд╛ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╢реЛрд╖рдг рдХрд░рддрд╛ рд╣реИред

Google рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ рдХрд┐ рдЖрдзреБрдирд┐рдХ рдХрдВрдкрд╛рдЗрд▓рд░реЛрдВ рдореЗрдВ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдбрдмрд▓ рдбреАрдлреНрд░реЗрдВрд╕рд┐рдВрдЧ рдХреЛ рдЕрднреА рдХреИрд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (2018 рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ)ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкрд╣рд▓реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдкрддрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдерд╛ рдФрд░ рд╣рдо рдЗрд╕ рдкрддреЗ рдкрд░ рдЧрдП рдереЗ, рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрд▓рдЧ рдХреЛрдб рд╣реИред

jmp *%r11 
    call l1
l0: pause
    lfence
    jmp l0
l1: mov %r11, (%rsp)
    ret

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд╣рдо l1 рдкрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдХреЙрд▓" рдХрд░рддреЗ рд╣реИрдВ, рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЗрд╕ рд▓реЗрдмрд▓ рдкрд░ рдЬрд╛рддреА рд╣реИ рдФрд░ рд╣рдо рдПрдХ рд╣реИрдХ рдХрд░рддреЗ рд╣реИрдВ: рдЬреИрд╕реЗ рдХрд┐ рд╣рдо рдПрдХ рдлрд╝рдВрдХреНрд╢рди (рдЬреЛ рдирд╣реАрдВ рд╣реИ) рд╕реЗ рд▓реМрдЯ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред рдЬрдм рд╣рдо рдирд┐рд░реНрджреЗрд╢ рдХрд░рддреЗ рд╣реИрдВ call, рддреЛ рд╣рдо рд░рд┐рдЯрд░реНрди рдПрдбреНрд░реЗрд╕, рд╕реНрдЯреИрдХ рдкрд░ рд╡рд░реНрддрдорд╛рди рдкрддрд╛, рдЗрд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ l1 рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░реЛрд╕реЗрд╕рд░, рдЬрдм рдЗрд╕рдХрд╛ рдкреНрд░реАрдлрд╝реЗрдЪрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдФрд░ рдлрд┐рд░ рдПрдХ рдмрд╛рдзрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╕рдм рдХреБрдЫ рдзреАрдорд╛ рд╣реЛрдЧрд╛ - рдпрд╣ рдкреНрд░реАрдлреЗрдЯрд┐рдВрдЧ рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрдВ рд╕реНрдкреЗрдХреНрдЯрд░ рдХреА рднреЗрджреНрдпрддрд╛ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдорд┐рд▓рддрд╛ рд╣реИред рдХреЛрдб рдзреАрдорд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди 15% рддрдХ рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред

рдЕрдЧрд▓рд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдирдпрд╛ рд╣рдорд▓рд╛ рдореЗрд▓реНрдЯрдбрд╛рдЙрди рд╣реИредред рдпрд╣ рдХреЗрд╡рд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдВрддрд░рд┐рдХреНрд╖ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИред рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЗрдореЛрд░реА рдкрдврд╝ рд░рд╣рд╛ рд╣реИред рд╣рдорд▓реЗ рдХреЛ рдХрд░реНрдиреЗрд▓ рдкрдЯ рдЯреЗрдмрд▓ рдЕрд▓рдЧрд╛рд╡ (рдХреЗрдкреАрдЯреАрдЖрдИ) рджреНрд╡рд╛рд░рд╛ рд░реЛрдХрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдирдП рдХрд░реНрдиреЗрд▓ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреЗрдкреАрдЯреАрдЖрдИ рдмрд╣реБрдд рдорд╣рдВрдЧрд╛ рд╣реИ, 30-40% рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ ( рдЬреИрд╕рд╛ рдХрд┐ MariaDB рджреНрд╡рд╛рд░рд╛ рдорд╛рдкрд╛ рдЧрдпрд╛ рд╣реИ )ред

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрдм рдЖрд▓рд╕реА рдЯреАрдПрд▓рдмреА рдЕрдиреБрдХреВрд▓рди рдирд╣реАрдВ рд╣реИ: рдХрд░реНрдиреЗрд▓ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрд╛ рдкрддрд╛ рд╕реНрдерд╛рди рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛рдУрдВ рдореЗрдВ рдЕрд▓рдЧ рд╣реЛ рдЧрдпрд╛ рд╣реИ (рдкрд╣рд▓реЗ, рдЖрд▓рд╕реА рдЯреАрдПрд▓рдмреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдкреГрд╖реНрда рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рд╕реНрдерд╛рди рдХреЛ рдореИрдк рдХрд░рддреЗ рдереЗ)ред рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП рджрд░реНрджрдирд╛рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкреЗрд╕реНрдЯрд╛ рдПрдлрдбрдмреНрд▓реНрдпреВ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдЬреЛ рдХрд░реНрдиреЗрд▓ рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ:





Saint HighLoad++ . , 6 -- ( , Saint HighLoad++) , web .

PHP Russia: 13 , . тАФ KnowledgeConf, ++ TechLead Conf тАФ . , , .

All Articles