{"id":301107,"date":"2020-04-01T15:00:59","date_gmt":"2020-04-01T15:00:59","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=301107"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=301107","title":{"rendered":"\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0431\u044b\u0441\u0442\u0440\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 HTTP-\u0441\u0442\u0440\u043e\u043a"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/493242\/\">\u0412 HTTP\/2 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u043d\u043e \u0442\u0435\u043b\u043e URI, Cookie, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f User-Agent \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0439, \u0435\u0441\u043b\u0438 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u0443 HTTP-\u0441\u0442\u0440\u043e\u043a\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 Tempesta FW. \u0415\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 Open Source \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0439\u0448\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/GcAJF4648JI?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <strong>\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u0440\u0438\u0436\u0430\u043d\u043e\u0432\u0441\u043a\u0438\u0439<\/strong> (<a href=\"https:\/\/habr.com\/ru\/users\/krizhanovsky\/\" class=\"user_link\">krizhanovsky<\/a>) \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 Tempesta Technologies, \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 Linux\/x86-64. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b HTTP-\u0441\u0442\u0440\u043e\u043a, \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Tempesta FW.<\/p>\n<p>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c: \u043a\u0430\u043a HTTP Flood \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0430\u0448 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 \u0432 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b x86-64 \u0441 branch mispredictions, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 FSM \u0441 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f GCC, \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, strspn()- \u0438 strcasecmp()-like \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f HTTP-\u0441\u0442\u0440\u043e\u043a, SSE, AVX2 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c AVX2.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u0412 Tempesta Technologies \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0444\u0442 \u043d\u0430 \u0437\u0430\u043a\u0430\u0437: \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u0432 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0433\u043e\u0440\u0434\u0438\u043c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u044f\u0434\u0440\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 WAF \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Positive Technologies. Web Application Firewall (WAF) \u2014 \u044d\u0442\u043e HTTP-proxy: \u043e\u043d \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u043b\u0443\u0431\u043e\u043a\u0438\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u043e\u043c HTTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u0430\u0442\u0430\u043a (Web \u0438 DDoS). \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u044f\u0434\u0440\u043e.<\/p>\n<p>  \u041a\u0440\u043e\u043c\u0435 \u043a\u043e\u043d\u0441\u0430\u043b\u0442\u0438\u043d\u0433\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c <a href=\"https:\/\/github.com\/tempesta-tech\/tempesta\">Tempesta FW<\/a> \u2014 \u044d\u0442\u043e Application Delivery Controller (ADC). \u041e \u043d\u0435\u043c \u0438 \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c.<\/p>\n<h2>Application Delivery Controller<\/h2>\n<p>  Application Delivery Controller \u2014 \u044d\u0442\u043e HTTP-proxy c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e. \u041d\u043e \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c\u044e \u2014 \u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 DDoS \u0438 Web-\u0430\u0442\u0430\u043a. \u0422\u0430\u043a\u0436\u0435 \u0443\u043f\u043e\u043c\u044f\u043d\u0443 \u043e\u0431 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u0445, \u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0436\u0443 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mg\/gf\/tw\/mggftw9mux_ycaxzjbfqe6hpdc0.jpeg\"><\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c<\/h3>\n<p>  Tempesta FW \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u0432 \u044f\u0434\u0440\u043e Linux TCP\/IP Stack. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u0438 \u0440\u044f\u0434\u0443 \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439, \u043e\u043d \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u2014 \u043c\u043e\u0436\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c 1,8 \u043c\u043b\u043d \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u043d\u0430 \u0434\u0435\u0448\u0435\u0432\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435. \u042d\u0442\u043e \u0432 3 \u0440\u0430\u0437\u0430 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 Nginx \u043d\u0430 \u0442\u043e\u043f\u043e\u0432\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0438 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u043e, \u0435\u0441\u043b\u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u0441 <strong>kernel bypass approach.<\/strong><\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/te\/md\/pe\/temdpec1gcgnm98ktgwr4gewn-8.png\"><\/p>\n<p>  \u041d\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u044f\u0434\u0435\u0440 \u043e\u043d \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0441\u0445\u043e\u0436\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u043c Seastar, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 ScyllaDB (\u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 DPDK).<\/p>\n<h3>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430<\/h3>\n<p>  \u041f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0434\u0438\u043b\u0441\u044f \u0442\u043e\u0433\u0434\u0430 \u0436\u0435, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u043d\u0430\u0434 PT AF \u2014 \u0432 2013 \u0433\u043e\u0434\u0443. \u042d\u0442\u043e\u0442 WAF \u0431\u0430\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u043e\u043c Open Source HTTP-\u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u0435. Nginx, HAProxy, Varnish \u0438\u043b\u0438 Apache Traffic \u2014 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0438\u0435 HTTP-\u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u044b: \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043a\u044d\u0448\u0438\u0440\u0443\u044e\u0442, \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0442, \u043d\u043e \u043d\u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 <strong>\u043d\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430<\/strong>.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u0434\u0443\u043c\u0430\u043b\u0438, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0444\u0430\u0439\u0440\u0432\u043e\u043b \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u0434\u0435\u044e \u0438 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0432 TCP\/IP \u0441\u0442\u0435\u043a? \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f Tempesta FW \u2014 <strong>\u0433\u0438\u0431\u0440\u0438\u0434 HTTP-\u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0438 \u0444\u0430\u0439\u0440\u0432\u043e\u043b\u0430<\/strong>.<\/p>\n<p>  <em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: Nginx \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0434\u043e\u043a\u043b\u0430\u0434\u0435 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440. \u0412\u043c\u0435\u0441\u0442\u043e \u043d\u0435\u0433\u043e \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 Open Source HTTP-\u0441\u0435\u0440\u0432\u0435\u0440.<\/em><\/p>\n<h2>HTTP<\/h2>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 <strong>HTTP-\u0437\u0430\u043f\u0440\u043e\u0441<\/strong> (HTTP\/(1,~2))<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_o\/3z\/tq\/_o3ztqvtwrv-7epdryhdztg8wsq.png\"><\/p>\n<p>  \u0423 \u043d\u0430\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 URI. \u041a\u0440\u0430\u0441\u043d\u044b\u043c \u0436\u0438\u0440\u043d\u044b\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b <strong>\u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0430\u0436\u043d\u044b \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0440\u0430\u0437\u0431\u043e\u0440\u0430 HTTP. \u0412\u044b\u0434\u0435\u043b\u044e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438: \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u00ab\u0442\u043e\u0447\u043a\u0430 \u0441 \u0437\u0430\u043f\u044f\u0442\u043e\u0439\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0430\u0440\u0441\u0438\u0442\u044c, \u0438\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c &quot;\\r\\n&quot;.<\/p>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043e HTTP\/2 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043a\u0430\u0437\u0430\u0442\u044c.<\/p>\n<h3>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 HTTP\/2<\/h3>\n<p>  <strong>HTTP\/2 \u2014 \u044d\u0442\u043e \u0441\u043c\u0435\u0441\u044c \u0441\u0442\u0440\u043e\u043a \u0438 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>. \u042d\u0442\u043e\u0442 \u043c\u0438\u043a\u0441 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043a \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f, \u0447\u0435\u043c \u043a \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/p>\n<p>  <strong>HTTP\/2 \u0432 HPACK \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443<\/strong>. \u041f\u0435\u0440\u0432\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d, \u0435\u0433\u043e \u043d\u0435\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0412\u044b \u0435\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0415\u0441\u043b\u0438 \u043a \u0432\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 HTTP\/2 DDoS, \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439. \u0412 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 HTTP\/2 \u2014 \u044d\u0442\u043e \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043d\u043e \u0432\u044b \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0430\u0440\u0441\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u043d\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<p>  <strong>Huffman-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430<\/strong>. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430, \u043d\u043e Huffman \u0447\u0443\u0434\u043e\u0432\u0438\u0449\u043d\u043e \u0442\u044f\u0436\u0435\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0441\u0436\u0430\u0442\u0438\u044f: Huffman-\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0430 \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u0431\u0430\u0439\u0442\u0430, \u043d\u0435\u043b\u044c\u0437\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043d\u0443\u0436\u043d\u043e \u0438\u0434\u0442\u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c. \u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e 32 \u0438\u043b\u0438 \u043f\u043e 16 \u0431\u0430\u0439\u0442.<\/p>\n<p>  <strong>Cookie, User-Agent, Referer, URI \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u0448\u0438\u043c\u0438<\/strong>. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043d\u0438\u043c\u0430\u0435\u0442\u0435 Huffman, \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u0435\u0442\u0435 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440, \u0442\u0430\u043a\u043e\u0439 \u0436\u0435, \u043a\u0430\u043a \u0432 HTTP\/1. \u0425\u043e\u0442\u044f \u044d\u0442\u043e \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u043e RFC, \u043a\u0443\u043a\u0438 \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0441\u0436\u0438\u043c\u0430\u0442\u044c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0444\u0438\u0434\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u0442\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0435\u043c\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0438\u0445 \u0440\u0430\u0437\u043c\u0435\u0440\u0435.<\/p>\n<p>  <strong>\u041c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f HTTP-\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>. \u0412\u0441\u0435 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442 HTTP\/2 \u0438 \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u0434\u0430\u044e\u0442 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 HTTP\/1-\u043f\u0430\u0440\u0441\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0443\u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f HTTP\/1.<\/p>\n<p>  \u0412 \u0447\u0435\u043c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u043e\u043c HTTP\/1?<\/p>\n<ul>\n<li>\u041d\u0430\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c state machine.<\/li>\n<li>\u041d\u0430\u0434\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.<\/li>\n<\/ul>\n<p>  \u0412\u0440\u0435\u0434\u043e\u043d\u043e\u0441\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u043d\u0430\u0446\u0435\u043b\u0435\u043d \u043d\u0430 \u0441\u0430\u043c\u0443\u044e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0443\u044e (\u0441\u0430\u043c\u0443\u044e \u0441\u043b\u0430\u0431\u0443\u044e) \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440, \u0442\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u0442\u043e\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<h3>Nginx-\u043f\u0440\u043e\u0444\u0438\u043b\u044c<\/h3>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 nginx-\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043f\u043e\u0434 HTTP-flood. \u041e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u043c access log, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u043b\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430. \u041a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430, \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0432 top&#8217;\u0435.  <\/p>\n<div class=\"scrollable-table\">\n<table>\n<tbody>\n<tr>\n<td>%<\/td>\n<td>symbol name<\/td>\n<\/tr>\n<tr>\n<td>1,5719<\/td>\n<td>ngx_http_parse_header_line<\/td>\n<\/tr>\n<tr>\n<td>1,0303<\/td>\n<td>ngx_vslprintf<\/td>\n<\/tr>\n<tr>\n<td>0,6401<\/td>\n<td>memcpy<\/td>\n<\/tr>\n<tr>\n<td>0,5807<\/td>\n<td>recv<\/td>\n<\/tr>\n<tr>\n<td>0,5156<\/td>\n<td>ngx_linux_sendfile_chain<\/td>\n<\/tr>\n<tr>\n<td>0,4990<\/td>\n<td>ngx_http_limit_req_handler<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>\u0421\u043b\u0435\u0432\u0430 \u2014 \u00abFlat profile\u00bb. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e, \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0441\u0430\u043c\u0430\u044f \u0433\u043e\u0440\u044f\u0447\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u043d\u0435\u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0442\u044f\u0436\u0435\u043b\u0435\u0435, \u0447\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f, \u0430 \u043f\u043e\u0441\u043b\u0435 \u043d\u0435\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u044c \u0440\u043e\u0432\u043d\u043e \u0441\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0447\u0442\u043e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043d\u0435 \u0441\u0442\u0430\u043b\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u0442 \u0436\u0435 Nginx, \u0430 \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043b\u0443\u0447\u0448\u0438\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0433\u043e \u00ab\u0445\u0432\u043e\u0441\u0442\u0430\u00bb \u043f\u0440\u043e\u0444\u0438\u043b\u044f.<\/p>\n<h3>\u041a\u0430\u043a \u043a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u0435 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440\u044b<\/h3>\n<p>  \u041e\u0431\u044b\u0447\u043d\u043e \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0446\u0438\u043a\u043b (<code>while<\/code>), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0435\u0436\u0438\u0442 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0435, \u0438 \u0434\u0432\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435: \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f (<code>state<\/code>) \u0438 \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (<code>str_ptr<\/code>).<\/p>\n<p>  \u0412\u0445\u043e\u0434\u0438\u043c \u0432 \u0446\u0438\u043a\u043b (1) \u0438 \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (check state). \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u0432\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u0441\u0438\u043c\u0432\u043e\u043b <code><em>'b'<\/em><\/code><em>)<\/em> \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 (2).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hi\/z7\/s2\/hiz7s2e3yw5bpqqz-qbir5hbteq.png\"><\/p>\n<p>  \u041f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432 \u043a\u043e\u043d\u0435\u0446 <code>switch<\/code> (3) \u2014 \u044d\u0442\u043e \u0443\u0436\u0435 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u0434\u0430 \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u043c\u0430\u0445 \u0432 \u043a\u044d\u0448\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u0438\u0434\u0435\u043c \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e <code>while<\/code> (4), \u0441\u044a\u0435\u0434\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0441\u0438\u043c\u0432\u043e\u043b\u2026<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gk\/zs\/17\/gkzs17hdxtyfcaife8j1pms7wbi.png\"><\/p>\n<p>  \u2026 \u0438 \u0441\u043d\u043e\u0432\u0430 \u0438\u0449\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 <code>case 2:<\/code>.<\/p>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0432\u043e\u0438\u043b\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 <code>state<\/code> \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 <code>2<\/code>, \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e. \u041d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0434\u043d\u044f\u043b\u0438\u0441\u044c \u043d\u0430\u0432\u0435\u0440\u0445 \u0438 \u0435\u0449\u0435 \u0440\u0430\u0437 \u0441\u043f\u0443\u0441\u0442\u0438\u043b\u0438\u0441\u044c. \u041c\u044b \u00ab\u043d\u0430\u0440\u0435\u0437\u0430\u0435\u043c \u043a\u0440\u0443\u0433\u0438\u00bb \u043f\u043e \u043a\u043e\u0434\u0443 \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043f\u0443\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432\u043d\u0438\u0437. \u041d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u044e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Ragel \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u0440\u0441\u0435\u0440 \u0441 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/mc\/ba\/3w\/mcba3wgxqkflqjvq1mxytcy_kwo.png\"><\/p>\n<h3>HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 Nginx<\/h3>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043b\u043e\u0432 \u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0435 nginx \u0438 \u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p>  <strong>Nginx \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u043e\u0431\u044b\u0447\u043d\u044b\u043c API \u0441\u043e\u043a\u0435\u0442\u043e\u0432<\/strong> \u2014 \u0434\u0430\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u0430 \u0430\u0434\u0430\u043f\u0442\u0435\u0440, \u043a\u043e\u043f\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 user space. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0447\u0430\u043d\u043a \u0434\u0430\u043d\u043d\u044b\u0445, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438\u0449\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e.<\/p>\n<p>  Nginx \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0437\u0430 \u0434\u0432\u0430 \u043f\u0440\u043e\u0445\u043e\u0434\u0430: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u0449\u0435\u0442 \u0434\u043b\u0438\u043d\u0443, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442. \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0448\u0430\u0433\u0435 \u043e\u043d \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0430 \u0442\u043e\u043a\u0435\u043d\u044b, \u0438\u0449\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d (\u00ab\u043f\u0440\u043e\u0431\u043d\u044b\u0439\u00bb). \u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0438\u0440\u0443\u0435\u0442, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0435\u0446 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 (<code>Get<\/code>) \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>switch<\/code>, \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0443 \u0442\u043e\u043a\u0435\u043d\u0430.<\/p>\n<pre><code class=\"cpp\">for (p = b-&gt;pos; p &lt; b-&gt;last; p++) {     ...     switch (state) {     ...     case sw_method:         if (ch == ' ') {             m = r-&gt;request_start;             switch (p - m) {         \/\/ switch on token length!             case 3:                 if (ngx_str3_cmp(m, 'G', 'E', 'T', ' ')) {                 ...             }             if ((ch &lt; 'A' || ch &gt; 'Z') &amp;&amp; ch != '_' &amp;&amp; ch != '-')                 return NGX_HTTP_PARSE_INVALID_METHOD;             break;     ...<\/code><\/pre>\n<p>  <strong>\u00abGet\u00bb \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u043c \u0447\u0430\u043d\u043a\u0435 \u0434\u0430\u043d\u043d\u044b\u0445<\/strong>. Tempesta FW \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 zero-copy. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0441 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c: \u043f\u043e 1 \u0431\u0430\u0439\u0442\u0443 \u0438\u043b\u0438 \u043f\u043e 1000 \u0431\u0430\u0439\u0442. \u042d\u0442\u043e\u0442 \u00ab\u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u00bb \u043d\u0430\u043c \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 <code>switch<\/code> \u0432 GCC.<\/p>\n<h2>GCC<\/h2>\n<p>  <strong>Lookup table<\/strong>. \u0421\u043b\u0435\u0432\u0430 \u2014 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 enum: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 0, \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043c\u0435\u0442\u043a\u0438, 26 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442. \u0421\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ac\/1n\/hh\/ac1nhhz9jqe87hdqb6bxfv541vu.png\"><\/p>\n<p>  \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e <code>state<\/code> \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 EAX \u0441 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u043e\u0439. \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435 \u043c\u0435\u0442\u043a\u0438 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043f\u043e 8 \u0431\u0430\u0439\u0442 (lookup table). \u041d\u0430 \u044d\u0442\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0432 \u044d\u0442\u043e\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439. \u0421\u043d\u0438\u0437\u0443 \u0441\u043f\u0440\u0430\u0432\u0430 \u043a\u043e\u0434, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u043f\u0435\u0440\u0435\u0448\u043b\u0438 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438: \u0435\u0441\u043b\u0438 \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0442\u043e \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u0430\u0434\u0440\u0435\u0441 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e. \u0412\u0430\u0436\u043d\u043e \u0437\u043d\u0430\u0442\u044c, \u0447\u0442\u043e \u0432 \u0436\u0438\u0437\u043d\u0438 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0445\u0443\u0436\u0435, \u0447\u0435\u043c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u2014 \u0434\u043b\u044f lookup table \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 <a href=\"https:\/\/support.google.com\/faqs\/answer\/7625886\">\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442<\/a> \u043a\u043e\u0434 \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 <a href=\"https:\/\/lwn.net\/Articles\/743265\/\">\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f<\/a> \u0434\u043b\u044f Spectre-\u0430\u0442\u0430\u043a\u0438.<\/p>\n<p>  <strong>\u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a<\/strong>. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043a\u0435\u0439\u0441 \u2014 <code>switch<\/code> \u043d\u0435 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430\u043c\u0438, \u0430 \u0441 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u043c\u0438. \u041a\u043e\u0434 \u0442\u043e\u0442 \u0436\u0435, \u043d\u043e \u0442\u0435\u043f\u0435\u0440\u044c GCC \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430. \u041e\u043d \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/as\/mo\/7p\/asmo7pb4lxsv7pchnafv-qjz7u4.png\"><\/p>\n<p>  \u0421\u043f\u0440\u0430\u0432\u0430 \u0432\u0438\u0434\u0438\u043c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435, \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u0435 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u2014 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0438\u0434\u0435\u0442 \u043f\u043e \u043a\u043e\u0434\u0443.<\/p>\n<p>  <strong>HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 nginx. <\/strong>\u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 state machine nginx. \u0412 \u043d\u0435\u0439 9 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u043a\u043e\u0434\u0430 \u2014 \u044d\u0442\u043e \u0432 \u0442\u0440\u0438 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u043d\u0430 \u043c\u0430\u0448\u0438\u043d\u0435, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u0438\u0441\u044c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 (\u043a\u0430\u043a \u0438 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 x86-64 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432).<\/p>\n<pre><code class=\"bash\">$ nm -S \/opt\/nginx-1.11.5\/sbin\/nginx | grep http_parse | cut -d' ' -f 2 | perl -le '$a += hex($_) while (&lt;&gt;); print $a' 9220  $ getconf LEVEL1_ICACHE_SIZE 32768  $ grep -c 'case sw_' src\/http\/ngx_http_parse.c 84<\/code><\/pre>\n<p>  \u041f\u0430\u0440\u0441\u0435\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 nginx <code>ngx_http_parse_header_line ()<\/code> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0442\u043e\u0440. \u041e\u043d \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u0438\u0445 \u0438\u043c\u0435\u043d\u0430\u043c\u0438, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d\u044b HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0432 \u0445\u044d\u0448. \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u2014 \u043f\u0440\u043e\u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0439\u0442\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u0435 \u0430\u043d\u0430\u043b\u0438\u0437.<\/p>\n<p>  \u041c\u044b \u0436\u0435 \u0434\u043e\u043b\u0436\u043d\u044b <strong>\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u043c\u0435\u043d\u0430 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 <\/strong>\u0438\u0437 \u0441\u043e\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438<strong>.<\/strong><\/p>\n<h3>Tempesta FW: \u0441\u0442\u0440\u043e\u0433\u0430\u044f \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f HTTP-\u0441\u0442\u0440\u043e\u043a<\/h3>\n<p>  \u041d\u0430\u0448\u0430 state machine \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043c\u043e\u0449\u043d\u0435\u0435: \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043f\u043e RFC \u0438 \u0441\u0440\u0430\u0437\u0443, \u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u0435, \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c. \u0415\u0441\u043b\u0438 \u0432 nginx 80 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439, \u0442\u043e \u0443 \u043d\u0430\u0441 \u2014 520, \u0438 \u0438\u0445 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435. \u0415\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u043b\u0438 \u043d\u0430 <code>switch<\/code>, \u0442\u043e \u043e\u043d \u0431\u044b\u043b \u0431\u044b \u0432 10 \u0440\u0430\u0437 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u0423 \u043d\u0430\u0441 <strong>zero-copy I\/O<\/strong> \u2014 \u0447\u0430\u043d\u043a\u0438 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0437\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0435\u0441\u0442\u0430\u0445. \u0440\u0430\u0437\u043d\u044b\u0435 \u0447\u0430\u043d\u043a\u0438 \u043c\u043e\u0433\u0443\u0442 \u0440\u0435\u0437\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0434\u0430\u043d\u043d\u044b\u0435. \u0412 zero-copy I\/O, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u00abGET\u00bb \u043c\u043e\u0436\u0435\u0442 (\u0440\u0435\u0434\u043a\u043e) \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u00abGET\u00bb, \u00abGE\u00bb \u0438 \u00abT\u00bb \u0438\u043b\u0438 \u00abG\u00bb, \u00abE\u00bb \u0438 \u00abT\u00bb, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u0440\u0446\u0438\u044f\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041c\u044b \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u0437\u0430\u0442\u0440\u0430\u0442\u044b \u043d\u0430 I\/O, \u043d\u043e \u0432 \u043f\u0440\u043e\u0444\u0438\u043b\u0435 \u0432\u0437\u043b\u0435\u0442\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u2014 \u0432\u0441\u0435 \u043f\u043b\u043e\u0445\u043e. \u0411\u043e\u043b\u044c\u0448\u043e\u0439 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 \u043e\u0434\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435.<\/p>\n<pre><code class=\"bash\">$ 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<\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0447\u0442\u043e\u0431\u044b \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e?<\/p>\n<h3>\u041f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b FSM<\/h3>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u2014 <strong>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435 \u0446\u0438\u043a\u043b, \u0430 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043f\u043e \u043c\u0435\u0442\u043a\u0430\u043c (<\/strong><code>go to<\/code><strong>)<\/strong>. \u0422\u0430\u043a\u043f\u043e\u0441\u0442\u0443\u043f\u0430\u044e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, Ragel.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bq\/di\/pr\/bqdipr9bt6au4ifisfpvjli2p_e.png\"><\/p>\n<p>  \u041c\u044b \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u043d\u0430\u0448\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u0435\u0442\u043a\u043e\u0439 \u0432 <code>switch<\/code> \u0438 \u043c\u0435\u0442\u043a\u043e\u0439 \u044f\u0437\u044b\u043a\u0430 C \u0441 <a href=\"https:\/\/github.com\/tempesta-tech\/tempesta\/blob\/master\/lib\/fsm.h#L40\">\u0442\u0430\u043a\u0438\u043c \u0436\u0435 \u0438\u043c\u0435\u043d\u0435\u043c<\/a>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438, \u043c\u044b \u043d\u0430\u0445\u043e\u0434\u0438\u043c \u043c\u0435\u0442\u043a\u0443 \u0432 <code>switch<\/code> \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0438\u0437 \u043a\u043e\u0434\u0430 \u043a \u044d\u0442\u043e\u043c\u0443 \u0436\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e. \u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437 \u043c\u044b \u0438\u0434\u0435\u043c \u0447\u0435\u0440\u0435\u0437 <code>switch<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0441\u0440\u0430\u0437\u0443 \u043d\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u043c\u0435\u0442\u043a\u0443.<\/p>\n<p>  <strong>\u041d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u043a<\/strong>: \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0442\u043e \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u0446\u0435\u043d\u0438\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0449\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 (\u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e zero-copy I\/O). \u0422\u0435\u043b\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f <code>for<\/code> \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435: \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 switch-driven FSM, \u0443 \u043d\u0430\u0441 \u0438\u0445 500 \u2014 \u043f\u043e \u0447\u0438\u0441\u043b\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439. \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u0437\u0434\u043e\u0440\u043e\u0432\u043e.<\/p>\n<p>  \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 state machine, \u0434\u043b\u044f <code>for<\/code> \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c <code>switch<\/code> \u0432\u043d\u0443\u0442\u0440\u0438, GTC \u0442\u043e\u0436\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code>for<\/code> \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p>  <strong>\u0417\u0430\u043c\u0435\u043d\u044f\u0435\u043c <\/strong><code><strong>switch<\/strong><\/code><strong> \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438. <\/strong>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u2014 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>switch<\/code> \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043f\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0430\u0434\u0440\u0435\u0441\u0430\u043c \u043c\u0435\u0442\u043e\u0432. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0441\u0440\u0430\u0437\u0443 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u043d\u0443\u0436\u043d\u0443\u044e \u0442\u043e\u0447\u043a\u0443, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0448\u043b\u0438 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e. GCC \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/i3\/x5\/7m\/i3x57mb0tahhz99szccnfdbxde0.png\"><\/p>\n<p>  \u0423 GCC \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043c\u043e\u0447\u044c. \u0411\u0435\u0440\u0435\u043c \u0438\u043c\u044f \u043c\u0435\u0442\u043a\u0438 (\u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e <code>from<\/code>) \u0438 \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0435\u0435 \u0430\u0434\u0440\u0435\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 C-\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0447\u0435\u0440\u0435\u0437 \u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u0430\u043c\u043f\u0435\u0440\u0441\u0430\u043d\u0434 (&amp;&amp;). \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0435\u0439 <code>jmp<\/code> \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u044d\u0442\u043e\u0439 \u043c\u0435\u0442\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>goto<\/code>.<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u0447\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f.<\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u043c\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432<\/h3>\n<p>  \u041d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043a\u043e\u0434\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043f\u0440\u044f\u043c\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0434\u0430\u0436\u0435 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <code>switch<\/code>. \u041d\u043e \u0434\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u0445 state machine \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0415\u0441\u043b\u0438 state machine \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u0431\u044b\u0447\u043d\u044b\u043c <code>switch<\/code>.<\/p>\n<pre><code class=\"bash\">$ 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<\/code><\/pre>\n<p>  <em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043a\u043e\u0434 Tempesta \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0447\u0435\u043c \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445. \u041d\u0430 GitHub \u0435\u0441\u0442\u044c \u0432\u0441\u0435 <\/em><a href=\"https:\/\/github.com\/tempesta-tech\/blog\/tree\/master\/http_benchmark\"><em>\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438<\/em><\/a><em>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u0441\u0435 \u0432 \u0434\u0435\u0442\u0430\u043b\u044f\u0445. \u041e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u0430\u0440\u0441\u0435\u0440\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d <\/em><a href=\"https:\/\/github.com\/tempesta-tech\/tempesta\/blob\/master\/tempesta_fw\/http_parser.c\"><em>\u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/em><\/a><em> (\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440). \u041a\u0440\u043e\u043c\u0435 \u043d\u0435\u0433\u043e, \u0432 Tempesta FW \u0435\u0441\u0442\u044c <\/em><a href=\"https:\/\/github.com\/tempesta-tech\/tempesta\/blob\/master\/lib\/fsm.h\"><em>\u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043f\u043e\u043c\u0435\u043d\u044c\u0448\u0435<\/em><\/a><em>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 FSM \u043f\u043e\u043f\u0440\u043e\u0449\u0435. <\/em><\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u043f\u0440\u044f\u043c\u044b\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435<\/h3>\n<p>  \u0412 state machine \u043c\u044b \u043c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043f\u043e \u043a\u043e\u0434\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 (\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e) \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e branch mispredictions. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u00ab\u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433\u00bb \u043f\u043e branch-misses prediction: <\/p>\n<pre><code class=\"bash\">perf record -e branch-misses -g .\/http_benchmark 406 states:    switch       - 38% on switch(),                direct jumps - 13% on header value parsing \t\t\t    7,27 states:   switch       - &lt;18% switch(), up to 40% for()                direct jumps \u2013 up to 46% on header &amp; URI parsing<\/code><\/pre>\n<p>  \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 state machine \u0432 406 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0439 \u043c\u044b \u0442\u0440\u0430\u0442\u0438\u043c 38% \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 \u0432 <code>switch<\/code>. \u041d\u0430 state machine \u0441 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u2014 \u044d\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u0432\u0445\u043e\u0434\u044f\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043a\u043e\u043d\u0446\u0430 \u0441\u0442\u0440\u043e\u043a\u0438: \u0443\u0441\u043b\u043e\u0432\u0438\u0435 <code>for<\/code> \u0432 state machine \u043d\u0430 <code>switch<\/code>.<\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  \u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0431\u043e\u0438\u0445 \u0442\u0438\u043f\u043e\u0432 state machine \u043f\u043e \u044d\u0432\u0435\u043d\u0442\u0430\u043c L1 instruction cache miss \u2014 \u043f\u043e\u0447\u0442\u0438 30 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0434\u043b\u044f <code>switch<\/code> \u0438 50 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0434\u043b\u044f \u043f\u0440\u044f\u043c\u044b\u0445 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u043e\u0432 (\u0431\u043e\u043b\u044c\u0448\u0435, \u0447\u0435\u043c \u043a\u044d\u0448 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438).<\/p>\n<p>  \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u043c\u044b \u043d\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c\u0441\u044f \u0432 \u043a\u044d\u0448, \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u043a\u044d\u0448-\u043f\u0440\u043e\u043c\u0430\u0445\u043e\u0432 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 state machine. \u041d\u043e \u043d\u0435\u0442, \u0438\u0445 \u0432 2 \u0440\u0430\u0437\u0430 \u043c\u0435\u043d\u044c\u0448\u0435. \u0412\u0441\u0435 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u044d\u0448 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043b\u0443\u0447\u0448\u0435: \u043c\u044b \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043a\u043e\u0434\u043e\u043c \u0438 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u043c \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0441\u0442\u0430\u0440\u0448\u0438\u0445 \u043a\u044d\u0448\u0435\u0439.<\/p>\n<h3>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u043a\u043e\u0434\u0430<\/h3>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434 state machine \u043d\u0430 <code>go to<\/code>, \u0442\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0437\u0432\u0430\u043d\u044b \u043f\u0435\u0440\u0432\u044b\u043c\u0438 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445: HTTP-\u043c\u0435\u0442\u043e\u0434, URI, \u0430 \u043f\u043e\u0442\u043e\u043c HTTP-\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438. \u041a\u0430\u0436\u0435\u0442\u0441\u044f \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c, \u0447\u0442\u043e \u043a\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u044d\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437, \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043c\u044b \u0438\u0434\u0435\u043c \u043f\u043e \u0434\u0430\u043d\u043d\u044b\u043c. \u041d\u043e \u044d\u0442\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u0442\u0430\u043a. \u0415\u0441\u043b\u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0442\u044c \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434, \u0442\u043e \u0443\u0432\u0438\u0434\u0438\u043c \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0435\u0449\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/tg\/uf\/zr\/tgufzrnfusabmvn1gg9ulzjgvgo.png\"><\/p>\n<p>  \u0421\u043b\u0435\u0432\u0430 \u2014 \u044d\u0442\u043e \u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0430\u0440\u0441\u0438\u043c \u043c\u0435\u0442\u043e\u0434\u044b <code>GET<\/code> \u0438 <code>POST<\/code>, \u043f\u043e\u0442\u043e\u043c \u0433\u0434\u0435-\u0442\u043e \u0434\u0430\u043b\u0435\u043a\u043e \u0432\u043d\u0438\u0437\u0443 \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 <code>UNLOCK<\/code>. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433<code> GET<\/code> \u0438 <code>POST<\/code>, \u0430 \u043f\u043e\u0442\u043e\u043c \u0443\u0436\u0435 <code>UNLOCK<\/code>. \u041d\u043e \u0432\u0441\u0435 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: <code>GET<\/code> \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435, <code>POST<\/code> \u0432 \u043a\u043e\u043d\u0446\u0435, \u0430 <code>UNLOCK<\/code> \u0441\u0432\u0435\u0440\u0445\u0443.<\/p>\n<p>  \u042d\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u043a\u0430\u043a \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u044f\u0442 \u0434\u0430\u043d\u043d\u044b\u0435. \u041e\u043d \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u043a\u043e\u0434 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u0432\u043e\u0435\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u0439 \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430. \u0427\u0442\u043e\u0431\u044b \u043e\u043d \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u043b \u043a\u043e\u0434 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong>\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043d\u044b\u0439 \u0431\u0430\u0440\u044c\u0435\u0440<\/strong>.<\/p>\n<p>  \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043d\u044b\u0439 \u0431\u0430\u0440\u044c\u0435\u0440 \u2014 \u044d\u0442\u043e \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430, \u0447\u0435\u0440\u0435\u0437 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a. \u041f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u0441\u0442\u0430\u0432\u0438\u0432 \u0442\u0430\u043a\u0438\u0435 \u0431\u0430\u0440\u044c\u0435\u0440\u044b, \u043c\u044b <strong>\u0443\u043b\u0443\u0447\u0448\u0438\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0430 4%<\/strong>.<\/p>\n<pre><code class=\"cpp\">STATE(sw_method) {     ... \/\/ the most frequent states     MATCH(NGX_HTTP_GET, &quot;GET &quot;);     MATCH(NGX_HTTP_POST, &quot;POST&quot;);          __asm__ __volatile__(&quot;&quot;: : :&quot;memory&quot;);     ... \/\/ 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)<\/code><\/pre>\n<p>  <\/p>\n<h2>\u041a\u043e\u043c\u043f\u043e\u043d\u0443\u0435\u043c \u043a\u043e\u0434 \u043f\u043e-\u0441\u0432\u043e\u0435\u043c\u0443<\/h2>\n<p>  \u0420\u0430\u0437 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0442\u043e \u0441\u0434\u0435\u043b\u0430\u0435\u043c <strong>profiler guided optimization <\/strong>(\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430). Profiler guided optimization (PGO) \u2014 \u043e\u0431\u0449\u0435\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u044b\u0431\u043e\u0440\u043e\u043a, \u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u043e\u0432. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, URI \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u044b\u0431\u043e\u0440\u043e\u043a, \u0447\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437 \u043c\u0435\u0442\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 URI \u043f\u0435\u0440\u0435\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u043c\u0435\u0442\u043e\u0434\u0430.<\/p>\n<p>  \u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u0434, \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430 \u043d\u0435\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438, \u043e\u0442\u0434\u0430\u0434\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433\u0430 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0443, \u0438 \u043e\u043d \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u041d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u0430\u043c\u044b\u0435 \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043a\u0438 \u043a\u043e\u0434\u0430, \u043d\u043e \u043d\u0435 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0415\u0441\u043b\u0438 \u0441\u0430\u043c\u044b\u0439 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0432 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 URI, \u0442\u043e \u044d\u0442\u043e \u0438 \u0431\u0443\u0434\u0435\u0442 \u0441\u0430\u043c\u043e\u0435 \u0433\u043e\u0440\u044f\u0447\u0435\u0435 \u043c\u0435\u0441\u0442\u043e. URI \u043f\u043e\u0434\u043d\u0438\u043c\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043f \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0430 PGO \u043d\u0435 \u043f\u043e\u043a\u0430\u0436\u0435\u0442, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 URI \u0432\u0441\u0435\u0433\u0434\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0438\u043c\u044f \u043c\u0435\u0442\u043e\u0434\u0430. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, PGO \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">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: ...<\/code><\/pre>\n<p>  \u0427\u0442\u043e \u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442?<\/p>\n<p>  <code><strong>likely<\/strong><\/code>\/<code><strong>unlikely<\/strong><\/code> <strong>\u043c\u0430\u043a\u0440\u043e\u0441\u044b<\/strong> (\u0434\u043b\u044f \u043a\u043e\u0434\u0430 \u044f\u0434\u0440\u0430 Linux, \u0432 user space \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043d\u0442\u0440\u0438\u043d\u0437\u0438\u043a\u0438 GCC <code>__builtin_expect()<\/code>). \u041e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442, \u043a\u0430\u043a\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0431\u043b\u0438\u0436\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, likely \u0441\u043e\u043e\u0431\u0449\u0430\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043b\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 <code>if<\/code>. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0435\u0434\u0432\u044b\u0431\u043e\u0440\u043a\u0430 \u043a\u043e\u0434\u0430 (prefetching \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430) \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/7x\/4u\/05\/7x4u057of2wmtq310wflcuyvlei.png\"><\/p>\n<p>  \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u043d\u0435\u0446 \u0438 \u0431\u0430\u0440\u044c\u0435\u0440. \u041c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u043b\u0438 \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043a\u043e\u0434 \u0437\u0430 \u0431\u0430\u0440\u044c\u0435\u0440\u043e\u043c. \u041a\u0430\u0436\u0435\u0442\u0441\u044f, \u0442\u0430\u043a\u043e\u0433\u043e \u0431\u044b\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u2014 \u043c\u044b \u0436\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0438 \u0431\u0430\u0440\u044c\u0435\u0440.<\/p>\n<p>  \u041d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438? \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0432\u0438\u0434\u0438\u0442 <code>likely<\/code> \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u043c\u044b \u0432\u043e\u0439\u0434\u0435\u043c \u0432 \u0442\u0435\u043b\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0438 \u0442\u0430\u043c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0430 \u0431\u0435\u0437\u0443\u0441\u043b\u043e\u0432\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043c\u0435\u0442\u043a\u0443 <code>Req_Uri<\/code>. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u00abhot path\u00bb. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0434\u0432\u0438\u0433\u0430\u0435\u0442 \u043a\u043e\u0434 \u043f\u043e\u0434 \u043c\u0435\u0442\u043a\u043e\u0439 \u0437\u0430 <code>if<\/code>, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0431\u0430\u0440\u044c\u0435\u0440, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0433\u043e\u0440\u044f\u0447\u0435\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0427\u0442\u043e\u0431\u044b \u0442\u0430\u043a\u043e\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e, GCC \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u044b <code>hot<\/code> \u0438 <code>cold<\/code> \u0434\u043b\u044f \u043c\u0435\u0442\u043e\u043a. \u041e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043a\u0430\u043a\u0430\u044f \u043c\u0435\u0442\u043a\u0430 \u0433\u043e\u0440\u044f\u0447\u0430\u044f (\u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430\u044f), \u0430 \u043a\u0430\u043a\u0430\u044f \u0445\u043e\u043b\u043e\u0434\u043d\u0430\u044f (\u043c\u0435\u043d\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0430\u044f).<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bw\/ra\/uh\/bwrauhxesqvk_ke22cw67cqwuja.png\"><\/p>\n<p>  \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0441\u043e\u0433\u043b\u0430\u0448\u0430\u0435\u043c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e <code>GET<\/code> \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u0435\u0435 <code>POST<\/code> \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0434\u043b\u044f \u043d\u0435\u0433\u043e <code>likely<\/code>. \u041f\u043e\u0434 \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 URI, \u0430 <code>POST<\/code> \u0443\u0445\u043e\u0434\u0438\u0442 \u043d\u0438\u0436\u0435. \u0412\u0435\u0441\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043d\u0430\u0438\u043c\u0435\u043d\u0435\u0435 \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0445 state machine \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432\u043d\u0438\u0437\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0442\u043a\u0430 \u0445\u043e\u043b\u043e\u0434\u043d\u0430\u044f.<\/p>\n<h3>\u041d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0439 -O3<\/h3>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430. \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0432 \u0433\u043e\u043b\u043e\u0432\u0443, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435 O2, \u0430 O3 \u2014 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u2014 O3 \u0438\u043d\u043e\u0433\u0434\u0430 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u0434 \u0445\u0443\u0436\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vc\/-p\/q8\/vc-pq8a078kyofsx7cj1ukorbta.png\"><\/p>\n<p>  <strong>O3 \u2014 \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0439<\/strong>. \u0415\u0441\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u043a O2 \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438, \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b: \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442, \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0435\u0448\u0430\u044e\u0442. \u0414\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u043a\u043e\u0434 \u043b\u0443\u0447\u0448\u0435. \u041e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u0437\u0434\u0435\u0441\u044c 1,820 \u0441\u0435\u043a\u0443\u043d\u0434 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e 1,838 \u0438 1,858.<\/p>\n<p>  \u0417\u0435\u043b\u0435\u043d\u044b\u043c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 \u2014 \u044d\u0442\u043e \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f.<\/p>\n<h3>\u0410\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0446\u0438\u043a\u043b\u0430 \u0438\u0437 <a href=\"https:\/\/www.gnu.org\/software\/gcc\/projects\/tree-ssa\/vectorization.html\">\u0433\u0430\u0439\u0434\u0430 GCC<\/a>.<\/p>\n<pre><code class=\"cpp\">int a[256], b[256], c[256]; void foo () {     for (int i = 0; i &lt; 256; i++)         a[i] = b[i] + c[i]; }<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u0442\u0441\u044f, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0438\u043a\u043b \u2014 \u0440\u0430\u0437\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u044b. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043d\u0430 \u0442\u0440\u0435\u0442\u044c\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 -O3 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f <strong>\u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/strong>: GCC \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0433\u0434\u0435 \u043c\u043e\u0436\u0435\u0442. \u041d\u043e <strong>\u043d\u0435 \u0432\u0435\u0441\u044c \u043a\u043e\u0434<\/strong> \u043c\u043e\u0436\u043d\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u0442\u044c (\u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043e\u043d \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u043c \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435).<\/p>\n<p>  \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043e\u043f\u0446\u0438\u044e GCC <code>-fopt-info-vec-all<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043e, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0443\u0435\u0442\u0441\u044f, \u043d\u043e \u043a\u043e\u0434 \u0432\u0441\u0435 \u0440\u0430\u0432\u043d\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0445\u0443\u0436\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430: \u0438\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u043a\u043e\u0434. \u041d\u043e \u043c\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u043c \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0447\u0442\u043e \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442, \u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e.<\/p>\n<h3>\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435: \u043a\u0430\u043a \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441 GET?<\/h3>\n<p>  \u0414\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0445\u0430\u043a, \u043a\u0430\u043a \u0432 nginx: \u043d\u0435 \u043f\u0430\u0440\u0441\u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c, \u0430 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c <code>int<\/code> \u0438 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0438\u043c \u0441\u0442\u0440\u043e\u043a\u0438.<\/p>\n<pre><code class=\"cpp\">#define CHAR4_INT(a, b, c, d)    ((d &lt;&lt; 24) | (c &lt;&lt; 16) | (b &lt;&lt; 8) | a) if (p == CHAR4_INT('G', 'E', 'T', ' ')))     \/\/ we have GET as method<\/code><\/pre>\n<p>  \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <code>int<\/code> \u043d\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d, \u0442\u043e \u043e\u043d \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442\u0441\u044f \u0432 2-3 \u0440\u0430\u0437\u0430. \u041c\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 <a href=\"https:\/\/github.com\/tempesta-tech\/blog\/tree\/master\/int_align\">\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044d\u0442\u043e \u0434\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442.<\/p>\n<pre><code class=\"cpp\">$ .\/int_align Unaligned access = 6.20482 Aligned access = 2.87012 Read four bytes = 2.45249<\/code><\/pre>\n<p>  \u0422\u043e\u0433\u0434\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c <code>int<\/code>. \u0411\u0443\u0434\u0435\u043c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u0435\u0441\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 <code>int<\/code> \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u044b\u0439, \u0442\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u043f\u043e <code>int<\/code>, \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043f\u043e \u0431\u0430\u0439\u0442\u0430\u043c.<\/p>\n<pre><code class=\"cpp\"> (((long)(p) &amp; 3)   ? ((unsigned int)((p)[0]) | ((unsigned int)((p)[1]) &lt;&lt; 8)   | ((unsigned int)((p)[2]) &lt;&lt; 16) | ((unsigned int)((p)[3]) &lt;&lt; 24))   : *(unsigned int *)(p));<\/code><\/pre>\n<p>  \u041d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0445\u0443\u0436\u0435:<\/p>\n<pre><code class=\"bash\">full request line:     no difference method only:           unaligned      - 214ms                        aligned        - 231ms                        bytes          - 216ms<\/code><\/pre>\n<p>  \u0415\u0441\u043b\u0438 \u043a\u043e\u0440\u043e\u0442\u043a\u043e: \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c, \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u043c, \u043a\u043e\u0434\u043e\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430 \u0438 inlined \u043a\u043e\u0434\u043e\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u0440\u044f\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044e \u0438\u0437-\u0437\u0430 \u0431\u043e\u043b\u044c\u0448\u0435\u0433\u043e \u043e\u0431\u044a\u0435\u043c\u0430 \u043a\u043e\u0434\u0430. \u0412 \u043f\u0440\u043e\u0444\u0430\u0439\u043b\u0438\u043d\u0433\u0435 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438 \u043d\u0435 \u0431\u044b\u043b\u043e.<\/p>\n<p>  <em>\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435: \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u0441\u0443\u0436\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435, \u043c\u043e\u0436\u043d\u043e <\/em><a href=\"https:\/\/github.com\/tempesta-tech\/tempesta\/issues\/695\"><em>\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043d\u0430 GitHub<\/em><\/a><em>.<\/em><\/p>\n<h2>\u041f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u043c \u0432\u0430\u0436\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 HTTP?<\/h2>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 URI:<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/pw\/_d\/tw\/pw_dtwjndt-xro47gvj3qehvpm4.png\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u0438\u0432\u0435\u0440\u0435\u0434\u043b\u0438\u0432\u044b \u043a \u043e\u0442\u0435\u043b\u044e, \u0437\u0430\u0439\u0434\u0435\u0442\u0435 \u043d\u0430 Booking \u0438 \u0437\u0430\u0434\u0430\u0434\u0438\u0442\u0435 \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u044b, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 URI \u0431\u043e\u043b\u044c\u0448\u0435 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>  \u0423 nginx \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0430\u0441\u0441\u0438\u0432\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0430 <code>switch<\/code>\/<code>case<\/code>. \u041e\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0431\u044b\u0441\u0442\u0440\u043e. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 Tempesta FW, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u0440\u0441\u0438\u0442\u044c URI, \u043d\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0435\u0433\u043e \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u0439.<\/p>\n<pre><code class=\"cpp\">case sw_check_uri:     if (usual[ch &gt;&gt; 5] &amp; (1U &lt;&lt; (ch &amp; 0x1f)))         break;     switch (ch) {     case '\/':         r-&gt;uri_ext = NULL;         state = sw_after_slash_in_uri;         break;     case '.':         r-&gt;uri_ext = p + 1;         break;     case ' ':         r-&gt;uri_end = p;         state = sw_check_uri_http_09;         break;     case CR:         r-&gt;uri_end = p;         r-&gt;http_minor = 9;         state = sw_almost_done;         break;     case LF:         r-&gt;uri_end = p;         r-&gt;http_minor = 9;         goto done;     case '%':     r-&gt;quoted_uri = 1;     ...<\/code><\/pre>\n<p>  \u0415\u0449\u0435 \u043e\u0434\u0438\u043d URI: \/redir_lang.jsp?lang=foobar%0d%0aContent-Length:%200%0d<br \/>  %0a%0d%0aHTTP\/1.1%20200%20OK%0d%0aContent-Type:%20text\/<br \/>  html%0d%0aContent-Length:%2019%0d%0a%0d%0aShazam&lt;\/<br \/>  html&gt;. <\/p>\n<p>  \u041e\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u044b\u0439, \u043d\u043e \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u044f. \u041f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u0432\u044b\u0440\u044f\u0442\u044c\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u043e \u043f\u043e\u043d\u044f\u0442\u044c.<\/p>\n<p>  <strong>\u041f\u0440\u043e\u0432\u0435\u0434\u0435\u043c \u0442\u0435\u0441\u0442<\/strong>: \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u043f\u0435\u0440\u0432\u044b\u0439 URI, \u0441\u043a\u043e\u0440\u043c\u0438\u043c wrk, \u043d\u0430\u0442\u0440\u0430\u0432\u0438\u043c \u043d\u0430 nginx \u0438 \u0443\u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433 nginx \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0433\u043e\u0440\u044f\u0447\u0438\u043c.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/m-\/y1\/id\/m-y1idxtawyq5rjayodyb_r2tgq.png\"><\/p>\n<p>  \u0415\u0441\u043b\u0438 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043f\u0430\u0440\u0441\u0435\u0440 \u0443\u0436\u0435 \u0432 \u0442\u043e\u043f\u0435, \u0437\u0434\u0435\u0441\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0435\u0449\u0435 \u0433\u043e\u0440\u044f\u0447\u0435\u0435.<\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  <strong>\u0427\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0443 \u0441\u0442\u0440\u043e\u043a HTTP?<\/strong> \u0420\u0430\u0437\u043d\u044b\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u0438 <code>' : '<\/code> \u0438 <code>' , '<\/code>, \u0438 \u0434\u0430\u0436\u0435 \u043a\u043e\u043d\u0435\u0446 \u0441\u0442\u0440\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c, \u043a\u0430\u043a \u0434\u0432\u0443\u0445\u0431\u0430\u0439\u0442\u043d\u044b\u0439 <code>\\r\\n<\/code>, \u0442\u0430\u043a \u0438 \u043e\u0434\u043d\u043e\u0431\u0430\u0439\u0442\u043d\u044b\u0439 <code>\\n<\/code>, \u043e \u0447\u0435\u043c \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0432\u043d\u0430\u0447\u0430\u043b\u0435. \u041d\u0435\u0442 0-\u0442\u0435\u0440\u043c\u0438\u043d\u0430\u0446\u0438\u0438 C-\u0441\u0442\u0440\u043e\u043a \u2014 \u0432 \u0446\u0435\u043b\u044f\u0445 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0435\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0432 \u043f\u0430\u0440\u0441\u0435\u0440\u0435.<\/p>\n<ul>\n<li><code>strspn<\/code>: \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0430\u043b\u0444\u0430\u0432\u0438\u0442, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u0442\u0440\u043e\u043a\u0435, \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442, \u0445\u043e\u0442\u044f \u043e\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<li><code>strcasecmp()<\/code>. \u041d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f <code>x<\/code> \u0441 <code>Foo:<\/code>. \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0434\u043b\u044f <code>strcasecmp()<\/code> \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \/ \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435, \u0430 \u0437\u043d\u0430\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e.<\/li>\n<\/ul>\n<p>  \u041e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 \u043f\u043e\u0439\u043c\u0435\u043c, \u0447\u0442\u043e \u0432 \u043d\u0438\u0445 \u043d\u0435 \u0442\u0430\u043a.<\/p>\n<h2>\u0411\u044b\u0441\u0442\u0440\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b<\/h2>\n<p>  \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432.<\/p>\n<p>  Nginx \u2014 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0430\u0440\u0441\u0435\u0440, \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437\u0430\u0442\u043e\u0440 \u041e\u043d \u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 RFC. \u0415\u0441\u0442\u044c \u0435\u0449\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b PicoHTTPParser (H2O) \u0438 Cloudflare. \u041e\u043d\u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442 \u0434\u0430\u043d\u043d\u044b\u0435, \u043d\u043e \u043c\u043e\u0433\u0443\u0442 <a href=\"https:\/\/blog.cloudflare.com\/improving-picohttpparser-further-with-avx2\/\">\u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u044b<\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u043f\u043e RFC.<\/p>\n<p>  <strong>PCMESTRI. <\/strong>\u0412 \u043f\u0430\u0440\u0441\u0435\u0440\u0430\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043e\u0434\u0445\u043e\u0434\u043e\u0432. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f PCMESTRI, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432 Pico-\u043f\u0430\u0440\u0441\u0435\u0440\u0435.<\/p>\n<p>  \u0417\u0430\u0434\u0430\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u044b (ranges) \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043b\u0438\u0431\u043e 16 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432, \u043b\u0438\u0431\u043e 8 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432. \u0415\u0441\u043b\u0438 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432\u0441\u0435\u0433\u043e \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430 \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c. \u0418\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f Pico-\u043f\u0430\u0440\u0441\u0435\u0440 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 RFC, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0443 RFC \u0431\u043e\u043b\u044c\u0448\u0435 8 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u0432.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ks\/x8\/m_\/ksx8m_ixc0oy3kzucdwzumppaus.png\"><br \/>  \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440, \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443, \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u0432\u0438\u0434\u0438\u043c \u2014 \u0435\u0441\u0442\u044c \u0441\u043e\u0432\u043f\u0430\u0434\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  <strong>AVX2 \u2014 \u043f\u043e\u0434\u0445\u043e\u0434 CloudFlare. <\/strong>CloudFlare-\u043f\u0430\u0440\u0441\u0435\u0440 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e AVX2 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0437\u0430 \u0440\u0430\u0437 32 \u0431\u0430\u0439\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u0432\u043c\u0435\u0441\u0442\u043e 16 \u0431\u0430\u0439\u0442 \u0443 Pico-\u043f\u0430\u0440\u0441\u0435\u0440\u0430. \u0412 CloudFlare \u043b\u0443\u0447\u0448\u0435 \u043f\u0430\u0440\u0441\u0438\u043d\u0433, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0432\u0435\u043b\u0438 \u0435\u0433\u043e \u043d\u0430 AVX2.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/b8\/3j\/g1\/b83jg1epzz6ec6dllxv1j4a-0lo.png\"><\/p>\n<p>  \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0434\u043e \u043f\u0440\u043e\u0431\u0435\u043b\u0430 \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 ASCII, \u0432\u0441\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0431\u043e\u043b\u044c\u0448\u0435 128 \u0438 \u0431\u0435\u0440\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043a\u043e\u0434 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e.<\/p>\n<p>  <strong>\u0421\u0440\u0430\u0432\u043d\u0438\u043c PCMESTRI \u0438 AVX2. <\/strong>\u0414\u043b\u044f \u043d\u0430\u0441 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043b\u0438\u043c\u0438\u0442 \u2014 1500. \u042d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043f\u0430\u043a\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a \u043d\u0430\u043c \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442. \u0412\u0438\u0434\u0438\u043c, \u0447\u0442\u043e AVX2-\u043a\u043e\u0434 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c Pico-\u043f\u0430\u0440\u0441\u0435\u0440. \u041d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435 \u043d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 AVX2 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0442\u044f\u0436\u0435\u043b\u0435\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/se\/5t\/c2\/se5tc2npli1yed8ypqkdkk3z-pm.png\"><br \/>  \u0421\u0440\u0430\u0432\u043d\u0438\u043c \u0441 <code><strong>strspn<\/strong><\/code>. \u0415\u0441\u043b\u0438 \u043c\u044b \u0440\u0435\u0448\u0438\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>strspn<\/code> \u2014 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0445\u0443\u0436\u0435, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 \u00ab\u0431\u043e\u0435\u0432\u043e\u043c\u00bb \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u043d\u0435\u043b\u044c\u0437\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>strspn<\/code>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/bf\/08\/vq\/bf08vqlzni3dcjzxgiuj73zgszo.png\">  <\/p>\n<h2>Tempesta matcher \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0438 \u0442\u043e\u0447\u043d\u0435\u0435<\/h2>\n<p>  \u041d\u0430\u0448 \u043f\u0430\u0440\u0441\u0435\u0440 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043a\u0430\u043a \u044d\u0442\u0438 \u0434\u0432\u0430. \u041d\u0430 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u043d \u0442\u0430\u043a\u043e\u0439 \u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u044b\u0439, \u043a\u0430\u043a Pico-\u043f\u0430\u0440\u0441\u0435\u0440, \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u2014 \u043a\u0430\u043a CloudFlare. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d \u043d\u0435 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/5t\/ns\/lw\/5tnslwsd-ywmrv1d4xaj5_ypwbw.png\"><\/p>\n<p>  <strong>\u041a\u0430\u043a \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043f\u0430\u0440\u0441\u0435\u0440?<\/strong> \u041c\u044b, \u043a\u0430\u043a nginx, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 \u0438 \u043f\u043e \u043d\u0435\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u043b\u043e\u0433 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u043c\u0438 \u0441\u0440\u043e\u043a\u0430\u043c\u0438, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <code>likely<\/code>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e branch misprediction \u0434\u043b\u044f \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0445 \u0441\u0442\u0440\u043e\u043a \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u0435\u0435, \u0447\u0435\u043c \u0434\u043b\u044f \u0434\u043b\u0438\u043d\u043d\u044b\u0445. \u0412\u044b\u043d\u043e\u0441\u0438\u043c \u044d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043d\u0430\u0432\u0435\u0440\u0445. \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0432 4 \u0438\u0437-\u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u2014 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043e\u0449\u043d\u043e\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u0435. \u0415\u0441\u043b\u0438 \u0431\u0443\u0434\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 4 \u0431\u0430\u0439\u0442, \u0442\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u044f\u0436\u0435\u043b\u0435\u0435, \u0430 \u043a\u043e\u0434 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0435\u0435.<\/p>\n<pre><code class=\"cpp\">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 &lt;= 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 &amp; c1) == 0 ? c0 : 2 + (c2 ? c2 + c3 : 0);         }<\/code><\/pre>\n<p>  <strong>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043f\u0435\u0442\u043b\u044f \u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0445\u0432\u043e\u0441\u0442. <\/strong>\u0412 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043c\u044b \u0434\u0435\u043b\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435: \u0435\u0441\u043b\u0438 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u0438\u043d\u043d\u044b\u0435, \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e 128, 64, 32 \u0438\u043b\u0438 \u043f\u043e 16 \u0431\u0430\u0439\u0442. \u0418\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e 128: \u043c\u044b \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0430\u043d\u0430\u043b\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 (\u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e pipeline) \u0438 \u0441\u0443\u043f\u0435\u0440\u0441\u043a\u0430\u043b\u044f\u0440\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<pre><code class=\"cpp\">for ( ; unlikely(s + 128 &lt;= end); s += 128) {         n = match_symbols_mask128_c(__C.URI_BM, s);         if (n &lt; 128)                 return s - (unsigned char *)str + n; }  if (unlikely(s + 64 &lt;= end)) {         n = match_symbols_mask64_c(__C.URI_BM, s);         if (n &lt; 64)                 return s - (unsigned char *)str + n;         s += 64; }  if (unlikely(s + 32 &lt;= end)) {         n = match_symbols_mask32_c(__C.URI_BM, s);         if (n &lt; 32)                 return s - (unsigned char *)str + n;         s += 32; }  if (unlikely(s + 16 &lt;= end)) {         n = match_symbols_mask16_c(__C.URI_BM128, s);         if (n &lt; 16)                 return s - (unsigned char *)str + n;         s += 16; }<\/code><\/pre>\n<p>  <strong>\u0425\u0432\u043e\u0441\u0442.<\/strong> \u041a\u043e\u043d\u0435\u0446 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043d\u0430\u0447\u0430\u043b\u043e. \u0415\u0441\u043b\u0438 \u0443 \u043d\u0430\u0441 \u043c\u0435\u043d\u044c\u0448\u0435 16 \u0431\u0430\u0439\u0442, \u0442\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u043e 4 \u0431\u0430\u0439\u0442\u0430 \u0432 \u0446\u0438\u043a\u043b\u0435, \u0430 \u043f\u043e\u0442\u043e\u043c \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 3 \u0431\u0430\u0439\u0442 \u0432 \u043a\u043e\u043d\u0446\u0435.<\/p>\n<pre><code class=\"cpp\">while (s + 4 &lt;= end) {         c0 = uri_a[s[0]];         c1 = uri_a[s[1]];         c2 = uri_a[s[2]];         c3 = uri_a[s[3]];         if (!(c0 &amp; c1 &amp; c2 &amp; c3)) {                 n = s - (unsigned char *)str;                 return !(c0 &amp; 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 &amp; c1) ? n + c0 : n + 2 + c2;<\/code><\/pre>\n<p>  <strong>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 <\/strong>\u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0442\u0435\u043b\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041c\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 ASCII (\u043a\u0430\u043a \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435) \u043f\u043e 16 \u0441\u0442\u0440\u043e\u043a \u0438 8 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u043f\u0435\u0440\u0432\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 URI BM: \u043f\u0435\u0440\u0432\u0443\u044e \u0438 \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/9l\/cv\/k2\/9lcvk2_wg7qs6svdibpx9m1b09c.png\"><\/p>\n<p>  \u0410\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c, \u044d\u0442\u043e <code>0 @ P p<\/code> \u0438 <code>2 B R q R<\/code>. \u041a\u043e\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043e\u043d\u0438 \u0442\u0430\u043a: <code>b8 = inv(1011 1000) = 0 @ P p<\/code>, <code>f8 = inv(1111 1000) = 2 B R q R<\/code>.<\/p>\n<p>  \u041a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0432 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435: \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u043c \u0441 0, \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0430 \u043f\u043e\u0442\u043e\u043c \u0435\u0434\u0438\u043d\u0438\u0446\u044b \u2014 \u0442\u043e, \u0447\u0442\u043e \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e.<\/p>\n<p>  <strong>\u0420\u0430\u0441\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438 ASCII. <\/strong>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430 \u0432\u0445\u043e\u0434 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0441\u0442\u0440\u043e\u043a\u0430 <code>&quot;pr&quot;<\/code>: \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 ASCII, \u0432\u0442\u043e\u0440\u043e\u0439 \u0438\u0437 \u0432\u0442\u043e\u0440\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438. \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e shuffle, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0448\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0448\u0438 \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u043c \u044d\u0442\u0438\u0445 \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/_i\/zr\/ol\/_izrolii19qo5olblx0zzjgq_iu.jpeg\"><\/p>\n<p>  <strong>ID \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0434\u043b\u044f \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. <\/strong>\u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b ASCII \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435. \u041f\u043e\u0442\u043e\u043c \u043c\u044b \u00ab\u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043c\u00bb \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0438 \u0441\u0442\u0440\u043e\u043a, \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435: \u043d\u0430\u0448 \u0441\u0438\u043c\u0432\u043e\u043b \u0438\u043b\u0438 \u043d\u0435\u0442.<\/p>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0435 4 \u0431\u0438\u0442\u0430 \u043e\u0442 \u0431\u0430\u0439\u0442\u0430, \u043c\u044b \u0441\u0434\u0432\u0438\u0433\u0430\u0435\u043c\u0441\u044f \u0432\u043b\u0435\u0432\u043e. \u0423 AVX \u0435\u0441\u0442\u044c \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e 2 \u0431\u0430\u0439\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043c\u0435\u0449\u0430\u0435\u043c \u0431\u0430\u0439\u0442, \u043f\u043e\u0442\u043e\u043c n \u0441 \u043d\u0430\u0448\u0435\u0439 \u043c\u0430\u0441\u043a\u043e\u0439, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0431\u0438\u0442\u044b.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/d9\/xy\/xr\/d9xyxrmjyplbnhkpwrxbqblians.png\"><\/p>\n<p>  <strong>\u0420\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u0442\u043e\u043b\u0431\u0446\u044b ASCII. <\/strong>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0442\u043e\u0440\u043e\u0439 shuffle, \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u043c \u043a\u043e\u043b\u043e\u043d\u043a\u0443 \u043f\u043e \u043d\u0443\u0436\u043d\u044b\u043c \u043f\u043e\u0437\u0438\u0446\u0438\u044f\u043c. \u0412 \u043e\u0431\u043e\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u0431\u0430\u0439\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u043a\u043e\u043b\u043e\u043d\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u043a\u043e\u043b\u043e\u043d\u043a\u0443.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/hx\/g1\/2s\/hxg12sn4xw-qlt7miq97k0pnwgy.png\"><\/p>\n<p>  <strong>\u041f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u043e\u043d\u043e\u043a \u0438 \u0441\u0442\u0440\u043e\u043a \u043c\u0430\u0441\u043e\u043a<\/strong>. \u0414\u0435\u043b\u0430\u0435\u043c <code>and<\/code> (\u00ab\u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u0435\u043c\u00bb \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0441\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430\u043c\u0438) \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c, \u0447\u0442\u043e \u0432\u0445\u043e\u0434\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b \u2014 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 <code>and<\/code> \u043e\u0442 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u043e\u043d\u043a\u0438 \u0438 \u0441\u0442\u0440\u043e\u043a \u043d\u0435 \u043d\u0443\u043b\u0435\u0432\u043e\u0439.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/cd\/oa\/kw\/cdoakwgjf-oipltg_xeyyglobn8.png\"><\/p>\n<p>  <strong>\u041f\u043e\u0434\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c \u0432 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043d\u0443\u043b\u0435\u0439. <\/strong>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u044d\u0442\u043e \u0432\u0441\u0435 \u0438\u0437 \u0432\u0435\u043a\u0442\u043e\u0440\u0430 \u0432 <code>int<\/code> \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434 \u2014 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/f9\/ci\/tl\/f9citlkgsjvtxifi9qe3pdxu7su.png\"><\/p>\n<p>  <strong>\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u044b. <\/strong>\u0420\u0430\u0431\u043e\u0442\u0430\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 ASCII, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0435\u0448\u0435\u0432\u0443\u044e \u0444\u0438\u0447\u0443: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043d\u043e \u043d\u0438\u0447\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0441\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u0430\u043a\u043e\u0439 \u0430\u043b\u0444\u0430\u0432\u0438\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f URI, \u0438\u043c\u0435\u043d \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0440\u0430\u0437\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432. \u0412 HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u0435 URI \u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 8 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u043e\u0432 (\u043f\u043b\u044e\u0441-\u043c\u0438\u043d\u0443\u0441) \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043e\u0434\u043d\u043e\u0433\u043e HTTP \u0437\u0430\u043f\u0440\u043e\u0441\u0430. \u042d\u0442\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 \u0436\u0435 \u043a\u043e\u0434 \u0438 <strong>\u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c \u043f\u043e \u043e\u0434\u043d\u043e\u043c\u0443 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0443, \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, <\/strong>\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 URI. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u2014 \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443.<\/p>\n<h3>\u0410\u0442\u0430\u043a\u0438<\/h3>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u0435\u0439\u0441\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e.<\/p>\n<p>  <strong>SSRF-\u0430\u0442\u0430\u043a\u0430 \u0441 BlackHat&#8217;17<\/strong>(\u00abA New Era of SSRF\u00bb): <code><a href=\"http:\/\/google.com\/\">http:\/\/foo@evil.com:80@google.com\/<\/a><\/code> \u2014 \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b \u0430\u043c\u043f\u0435\u0440\u0441\u0430\u043d\u0434\u0430. \u0412 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u0432 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043d\u0435\u0442. \u041d\u043e \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f, \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0435 \u0438 \u0430\u0442\u0430\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0430.<\/p>\n<p>  <strong>RCE-\u0430\u0442\u0430\u043a\u0430: <\/strong>\u00abperform effective command injection attacks like\u00bb, BSides&#8217;16: <code>User-Agent: ...;echo NAELBD$((26+58))$echo(echo NAELBD)NAELBD...<\/code>. User-Agent \u2014 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u0435\u0434\u0435\u0440, \u043d\u043e \u0435\u0441\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0438 RCE-\u0430\u0442\u0430\u043a\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 <code>shell<\/code> \u0441 \u043d\u0435\u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438 \u0434\u043b\u044f User-Agent. \u0417\u0430\u0449\u0438\u0449\u0430\u0435\u043c\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u043d\u0430\u043a \u0434\u043e\u043b\u043b\u0430\u0440\u0430.<\/p>\n<p>  <strong>Relative Path Overwrite<\/strong>. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043a\u0435\u0439\u0441 \u2014 \u0442\u043e, \u0447\u0442\u043e \u0431\u044b\u043b\u043e \u0443 Google \u0432 2016 \u0433\u043e\u0434\u0443. \u0412 URI \u043f\u0440\u0438\u0435\u0445\u0430\u043b\u0438 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438, \u0434\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u044f \u2014 <code>...\/gallery?q=%0a{}*{background:red}\/..\/\/apis\/howto_guide.html<\/code>. \u042d\u0442\u043e \u043c\u0430\u043b\u043e\u0432\u0435\u0440\u043e\u044f\u0442\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0430\u043b\u0444\u0430\u0432\u0438\u0442\u0430.<\/p>\n<h3>strcasecmp()<\/h3>\n<p>  \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u041c\u044b \u0442\u043e\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e 32 \u0431\u0430\u0439\u0442\u0430, \u043f\u043e \u0434\u0432\u0430 \u043c\u0430\u0441\u0441\u0438\u0432\u0430.<\/p>\n<pre><code class=\"cpp\">__m256i CASE = _mm256_set1_epi8(0x20);  \/\/ Hacker\u2019s Delight for signed comparison: -0x80 for both operands __m256i A = _mm256_set1_epi8('A' \u2013 0x80); __m256i D = _mm256_set1_epi8('Z' - 'A' + 1 \u2013 0x80);  \/\/ Hacker\u2019s Delight: 'a' &lt;= v &lt;= 'z' to \/\/ v - ('a' \u2013 0x80) &lt; '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);<\/code><\/pre>\n<p>  \u041f\u0440\u0438\u0432\u043e\u0434\u0438\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u0437\u0430\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0430\u0440\u0441\u0435\u0440\u0435 \u0432 \u043d\u0438\u0436\u043d\u0435\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u043d\u0430\u0441 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0437\u043d\u0430\u043a\u043e\u0432\u044b\u0435, \u0432\u044b\u0447\u0438\u0442\u0430\u0435\u043c \u043f\u043e 128 \u0438\u0437 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 (\u0442\u0440\u044e\u043a \u0438\u0437 Hacker&#8217;s Delight).<\/p>\n<p>  \u0422\u0430\u043a\u0436\u0435 \u043c\u044b \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430: \u043c\u043e\u0436\u0435\u043c \u043b\u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u043d\u0435\u0442, \u044d\u0442\u043e \u0431\u0443\u043a\u0432\u0430 \u0438\u043b\u0438 \u043d\u0435\u0442. \u0412 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0432\u043c\u0435\u0441\u0442\u043e \u0434\u0432\u0443\u0445 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0439 \u043e\u0442 a \u0434\u043e z \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 (\u0442\u0440\u044e\u043a \u0438\u0437 Hacker&#8217;s Delight) \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0443.<\/p>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c strcasecmp()<\/h3>\n<p>  Tempesta \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435 GLIBC, \u0434\u0430\u0436\u0435 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 (18 \u0438\u043b\u0438 19). \u041a\u043e\u0434 <code>strcasecmp()<\/code> \u0442\u043e\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 AVX, \u043d\u043e \u043d\u0435 \u0432\u0442\u043e\u0440\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0421 AVX2 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0443 Tempesta \u043a\u043e\u0434 \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/wx\/zi\/pb\/wxzipbzdsbvge8u_abhsnok-gfa.png\"><\/p>\n<h2>FPU \u0432 \u044f\u0434\u0440\u0435 Linux<\/h2>\n<p>  \u041c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>\u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/strong> \u2014 \u043e\u043d\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0432 \u044f\u0434\u0440\u0435. \u0412\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u044e\u0442\u0441\u044f FPU \u043c\u043e\u0434\u0443\u043b\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u042d\u0442\u043e \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430, \u043d\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b, \u043d\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u044a\u0435\u043c\u043d\u044b\u0435.<\/p>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 Linux \u0435\u0441\u0442\u044c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f. \u0415\u0441\u043b\u0438 \u043c\u044b \u0438\u0434\u0435\u043c \u0438\u0437 \u044f\u0434\u0440\u0430 \u0432 user space \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0442\u043e \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 FPU \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 (XMM, YMM, ZMM): \u043c\u0435\u043d\u044f\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u044f\u0434\u0440\u043e \u041e\u0421 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u043c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0438, \u043c\u043e\u0436\u0435\u0442\u0435 \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <code>fpu_begin<\/code> \u0438 <code>fpu_end<\/code> \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 FPU \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432:<\/p>\n<pre><code class=\"cpp\">__kernel_fpu_begin_bh(); memcpy_avx(dst, src, n); __kernel_fpu_end_bh(); <\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 <strong>\u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0434\u0443\u043b\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u042d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b.<\/p>\n<h3>AVX \u0438 SSE<\/h3>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u043c\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 FPU, \u043f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f\u0445. \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043d\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c? \u0418\u043d\u043e\u0433\u0434\u0430 GCC \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u0434. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0430 \u0441\u0442\u0430\u0440\u044b\u0445 \u043c\u043e\u0434\u0435\u043b\u044f\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u0432 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0435\u043d\u0430\u043b\u044c\u0442\u0438 \u043e\u0442 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a\u043e\u0434\u0430 \u0441 SSE \u043d\u0430 AVX. \u0423 GCC \u0435\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043a\u043b\u044e\u0447 <code>vzeroupper<\/code> \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0435\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043b \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>vzeroupper<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043e\u0447\u0438\u0449\u0430\u0435\u0442 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u0442\u043e \u043f\u0438\u043d\u0430\u043b\u044c\u0442\u0438.<\/p>\n<p>  \u041d\u0443\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441\u043e \u0441\u0442\u0430\u0440\u044b\u043c \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u043b\u044f SSE \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0442\u0440\u0435\u0442\u044c\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439. \u042d\u0442\u043e \u043d\u0435 \u043d\u0430\u0448 \u0441\u043b\u0443\u0447\u0430\u0439 \u0438 \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e.<\/p>\n<h3>FPU<\/h3>\n<p>  \u0423 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c <a href=\"https:\/\/github.com\/tempesta-tech\/blog\/blob\/master\/kstrings\/memcpy_res.kernel\">\u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f<\/a> \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0435. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u0432 \u043b\u044e\u0431\u043e\u043c user space \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/n9\/vy\/0w\/n9vy0wal4alh1eelo1rbdjabavc.png\"><\/p>\n<p>  \u041b\u044e\u0431\u044b\u0435 \u0434\u0432\u0430 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041a\u043e\u0433\u0434\u0430 \u0432\u0430\u0448 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0438\u0434\u0435\u0442 \u0432 \u044f\u0434\u0440\u043e \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e, \u0432\u044b \u043d\u0435 \u0442\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u041d\u043e \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435\u0441\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0433\u043e user space \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 (context switch), \u0442\u043e \u043a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0442\u0430\u043c \u0438\u043d\u0432\u0430\u043b\u0438\u0434\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043a\u044d\u0448\u0438 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u0435\u0449\u0435 \u0438 \u043f\u043b\u043e\u0445\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043c\u043e\u0434\u0443\u043b\u044c context switch \u043d\u0430 FPU begin\/end. \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0440\u043e\u0433\u0430\u044f \u2014 \u043c\u0438\u043a\u0440\u043e\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a.<\/p>\n<p>  \u0412 \u043c\u0438\u043a\u0440\u043e\u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432\u0441\u0435 \u0434\u0440\u0430\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043d\u043e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433\u0430\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 user space \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043e\u043b\u0433\u043e. \u0412 \u044f\u0434\u0440\u0435 \u0443 \u043d\u0430\u0441 \u043d\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0441\u0435 \u0431\u044b\u0441\u0442\u0440\u043e. \u041c\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0435\u043a\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/p>\n<h3>Intelpocalypse<\/h3>\n<p>  \u0412 \u043d\u0430\u0447\u0430\u043b\u0435, \u044f \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b \u0432\u0430\u0440\u0438\u0430\u043d\u0442 lookup table \u0434\u043b\u044f \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 switch-\u043a\u043e\u0434\u0430: \u0434\u043e\u043b\u0433\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, enum, \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c switch-\u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0438\u0434\u0435\u043c \u043f\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u043c\u0443 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u044e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f, \u043f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u044e\u0449\u0435\u043c\u0443 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u043c\u0430\u0441\u0441\u0438\u0432\u0443. \u042d\u0442\u043e \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0434\u043b\u044f Spectre-\u0430\u0442\u0430\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435.<\/p>\n<p>  \u0423 Google \u0435\u0441\u0442\u044c \u0445\u043e\u0440\u043e\u0448\u0430\u044f <a href=\"https:\/\/support.google.com\/faqs\/answer\/7625886\">\u0441\u0442\u0430\u0442\u044c\u044f<\/a>, \u043a\u0430\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0434\u0432\u043e\u0439\u043d\u043e\u0435 \u0440\u0430\u0437\u044b\u043c\u0435\u043d\u043e\u0432\u044b\u0432\u0430\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445 (\u0441 \u043d\u0430\u0447\u0430\u043b\u0430 2018 \u0433\u043e\u0434\u0430). \u0420\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043e\u043d\u043e \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u043e. \u0415\u0441\u043b\u0438 \u0440\u0430\u043d\u044c\u0448\u0435 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0441\u044f \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0434\u0440\u0435\u0441 \u0438 \u043c\u044b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043b\u0438 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443, \u0442\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u0443 \u043d\u0430\u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u043a\u043e\u0434.<\/p>\n<pre><code class=\"cpp\">jmp *%r11      call l1 l0: pause     lfence     jmp l0 l1: mov %r11, (%rsp)     ret<\/code><\/pre>\n<p>  \u041a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u041c\u044b \u00ab\u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u00bb \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u043d\u0430 l1, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u044d\u0442\u0443 \u043c\u0435\u0442\u043a\u0443 \u0438 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0445\u0430\u043a: \u043a\u0430\u043a \u0431\u044b \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u0441\u044f \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 (\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0435\u0442), \u043d\u043e \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430. \u041a\u043e\u0433\u0434\u0430 \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e <code>call<\/code>, \u043d\u0430 \u0441\u0442\u0435\u043a\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u043c \u0430\u0434\u0440\u0435\u0441 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430, \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0430\u0434\u0440\u0435\u0441, \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u043c \u043d\u0443\u0436\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043d\u0430 l1. \u041d\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0435\u0433\u043e prefetcher, \u0432\u0438\u0434\u0438\u0442, \u0447\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0431\u0430\u0440\u044c\u0435\u0440. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u0432\u0441\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u2014 \u043e\u043d \u0431\u0440\u043e\u0441\u0430\u0435\u0442 prefetching \u0438 \u043c\u044b \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u043c\u0441\u044f \u043e\u0442 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 Spectre. \u041a\u043e\u0434 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 15%.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043d\u043e\u0432\u0430\u044f \u0430\u0442\u0430\u043a\u0430 \u2014 <strong>Meltdown<\/strong>. \u041e\u043d\u0430 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u0430 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f user space \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432. \u041e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u0430\u044f \u2014 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 \u044f\u0434\u0440\u0430 \u0438\u0437 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0410\u0442\u0430\u043a\u0443 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0435\u0442 Kernel Pate Table Isolation (KPTI), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0445 \u044f\u0434\u0440\u0430\u0445 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e. \u041d\u043e KPTI \u043e\u0447\u0435\u043d\u044c \u0434\u043e\u0440\u043e\u0433, \u0434\u043e 30-40% \u0434\u0435\u0433\u0440\u0430\u0434\u0430\u0446\u0438\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (<a href=\"https:\/\/mariadb.org\/myisam-table-scan-performance-kpti\/\">\u043f\u043e \u0437\u0430\u043c\u0435\u0440\u0430\u043c MariaDB<\/a>).<\/p>\n<p>  \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u0443 \u0432\u0430\u0441 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435\u0442 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 lazy TLB: \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u044f\u0434\u0440\u0430 \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 (\u0440\u0430\u043d\u044c\u0448\u0435 lazy TLB \u0434\u0435\u0440\u0436\u0430\u043b \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 \u044f\u0434\u0440\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430). \u0414\u043b\u044f user space \u044d\u0442\u043e \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u043e, \u0430 \u0434\u043b\u044f Tempesta FW, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0435\u0439 \u0432 \u044f\u0434\u0440\u0435 \u2014 \u043d\u0435\u0442.<\/p>\n<p>  \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0445 \u0441\u0441\u044b\u043b\u043e\u043a:<\/p>\n<ul>\n<li><a href=\"http:\/\/natsys-lab.blogspot.com\/2014\/11\/the-fast-finite-state-machine-for-http.html\">Fast Finite State Machine for HTTP Parsing<\/a><\/li>\n<li><a href=\"http:\/\/natsys-lab.blogspot.com\/2016\/10\/http-strings-processing-using-c-sse42.html\">HTTP Strings Processing Using C, SSE4.2 and AVX2<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li><a href=\"http:\/\/www.hackersdelight.org\/\">Hacker&#8217;s Delight<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/spectreattack.com\/\">Meltdown and Spectre attacks docs<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/medium.com\/@krizhanovsky\/intelpocalypse-goodbye-fast-system-calls-a0824683d67e\">Intelpocalypse: goodbye fast system calls<\/a><\/li>\n<\/ul>\n<p>  <\/p>\n<blockquote><p>\u041c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e <a href=\"https:\/\/www.highload.ru\/spb\/2020\">Saint HighLoad++<\/a> \u0441 \u0430\u043f\u0440\u0435\u043b\u044f \u043d\u0430 \u0430\u0432\u0433\u0443\u0441\u0442 \u0438\u043b\u0438 \u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044c \u044d\u0442\u043e\u0433\u043e \u0433\u043e\u0434\u0430. \u041d\u043e \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u0431\u0449\u0435\u043d\u0438\u0435, 6 \u0430\u043f\u0440\u0435\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0434\u0451\u043c \u043c\u0438\u043d\u0438-\u043e\u043d\u043b\u0430\u0439\u043d-\u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u044e (\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0443\u044e \u0434\u043b\u044f \u0432\u0441\u0435\u0445, \u0443 \u043a\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u0431\u0438\u043b\u0435\u0442\u044b \u043d\u0430 Saint HighLoad++) \u0438 \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u0440\u0438\u0436\u0430\u043d\u043e\u0432\u0441\u043a\u0438\u0439 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043c \u043e <a href=\"https:\/\/www.highload.ru\/spb\/2020\/abstracts\/6679\">\u043c\u0435\u0445\u0430\u043d\u0438\u043a\u0435 web \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u0430\u0446\u0438\u0438<\/a>. <\/p>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u043c\u044b \u043f\u043e\u0441\u0442\u0443\u043f\u0438\u043c \u0441 <a href=\"https:\/\/phprussia.ru\/moscow\/2020\">PHP Russia<\/a>: 13 \u043c\u0430\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043e\u043d\u043b\u0430\u0439\u043d, \u043e\u0444\u043b\u0430\u0439\u043d \u043e\u0441\u0435\u043d\u044c\u044e. \u0410 \u0432\u043e\u0442 \u0434\u043b\u044f \u0442\u0440\u0435\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u043a\u043e\u043d\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0439 \u2014 <a href=\"https:\/\/knowledgeconf.ru\/2020\">KnowledgeConf<\/a>, <a href=\"https:\/\/ritfest.ru\/2020\">\u0420\u0418\u0422++<\/a> \u0438 <a href=\"https:\/\/techleadconf.ru\/2020\">TechLead Conf<\/a> \u2014 \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0432 \u043e\u043d\u043b\u0430\u0439\u043d\u0435. \u0421\u043b\u0435\u0434\u0438\u0442\u0435 \u0437\u0430 \u043d\u0430\u043c\u0438 \u0432 <a href=\"http:\/\/eepurl.com\/VYVaf\">\u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0435<\/a> \u0438\u043b\u0438 \u0441\u043e\u0446\u0441\u0435\u0442\u044f\u0445, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u0447\u0442\u043e \u0438 \u043a\u0430\u043a \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.  <\/p><\/blockquote>\n<\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/493242\/\"> https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/493242\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/company\/oleg-bunin\/blog\/493242\/\">\u0412 HTTP\/2 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432, \u043d\u043e \u0442\u0435\u043b\u043e URI, Cookie, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f User-Agent \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043a\u0438\u043b\u043e\u0431\u0430\u0439\u0442 \u0438 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0442\u043e\u043a\u0435\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u043a. \u0417\u0430\u0434\u0430\u0447\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0439, \u0435\u0441\u043b\u0438 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u043d\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u043b\u043e\u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a. \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u043e\u0431\u0448\u0438\u0440\u043d\u044b\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a, \u043d\u043e \u0443 HTTP-\u0441\u0442\u0440\u043e\u043a\u0438 \u0435\u0441\u0442\u044c \u0441\u0432\u043e\u044f \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430. \u0418\u043c\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 Tempesta FW. \u0415\u0433\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 Open Source \u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u0438\u0442 \u0431\u044b\u0441\u0442\u0440\u0435\u0439\u0448\u0438\u0435 \u0438\u0437 \u043d\u0438\u0445.<\/p>\n<div class=\"oembed\">\n<div>\n<div style=\"left: 0; width: 100%; height: 0; position: relative; padding-bottom: 56.25%;\"><iframe src=\"https:\/\/www.youtube.com\/embed\/GcAJF4648JI?rel=0&amp;showinfo=1&amp;hl=en-US\" style=\"border: 0; top: 0; left: 0; width: 100%; height: 100%; position: absolute;\" allowfullscreen scrolling=\"no\" allow=\"encrypted-media; accelerometer; gyroscope; picture-in-picture\"><\/iframe><\/div>\n<\/div>\n<\/div>\n<p>  <strong>\u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u0440\u0438\u0436\u0430\u043d\u043e\u0432\u0441\u043a\u0438\u0439<\/strong> (<a href=\"https:\/\/habr.com\/ru\/users\/krizhanovsky\/\" class=\"user_link\">krizhanovsky<\/a>) \u043e\u0441\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u043e\u0440 Tempesta Technologies, \u044d\u043a\u0441\u043f\u0435\u0440\u0442 \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439 \u0432 Linux\/x86-64. \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u0442 \u043e\u0431 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b HTTP-\u0441\u0442\u0440\u043e\u043a, \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442, \u043f\u043e\u0447\u0435\u043c\u0443 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0442 \u0434\u043b\u044f \u0438\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0438 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 Tempesta FW.<\/p>\n<p>  \u041f\u043e\u0434 \u043a\u0430\u0442\u043e\u043c: \u043a\u0430\u043a HTTP Flood \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0430\u0448 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440 \u0432 \u0443\u0437\u043a\u043e\u0435 \u043c\u0435\u0441\u0442\u043e, \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b x86-64 \u0441 branch mispredictions, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u043d\u0435 \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u044c\u044e \u043d\u0430 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 HTTP-\u043f\u0430\u0440\u0441\u0435\u0440\u0430, \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 FSM \u0441 \u043f\u0440\u044f\u043c\u044b\u043c\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430\u043c\u0438, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f GCC, \u0430\u0432\u0442\u043e\u0432\u0435\u043a\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f, strspn()- \u0438 strcasecmp()-like \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0434\u043b\u044f HTTP-\u0441\u0442\u0440\u043e\u043a, SSE, AVX2 \u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f \u0438\u043d\u044a\u0435\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0430\u0442\u0430\u043a \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c AVX2.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-301107","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301107","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=301107"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/301107\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=301107"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=301107"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=301107"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}