{"id":478415,"date":"2026-05-03T22:10:14","date_gmt":"2026-05-03T22:10:14","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=478415"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=478415","title":{"rendered":"Buffer Pool \u0438 Clock-sweep: \u043a\u0430\u043a \u043c\u044b \u0431\u043e\u0440\u0435\u043c\u0441\u044f \u0441 cache pollution \u0438 p99 latency"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041e\u0434\u0438\u043d \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0441 \u043e\u0434\u043d\u0438\u043c <code>SELECT count(*) FROM orders<\/code> \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u044c p99 latency \u0432\u0441\u0435\u0433\u043e OLTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430. \u041f\u043e\u043a\u0430 \u0441\u043a\u0430\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, Buffer Pool \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u00ab\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u043c\u0438\u00bb \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0433\u043e\u0440\u044f\u0447\u0438\u0435 OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f, \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u044f\u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0438\u0441\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u044d\u0448\u0430 \u2014 \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 hot working set \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 cache pollution, \u0438 \u0441 \u043d\u0438\u043c \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u0421\u0423\u0411\u0414 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c LRU.<\/p>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/articles\/1022506\/\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 API-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438 OLTP-\u044f\u0434\u0440\u0430, USDT\/eBPF-\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 Adaptive Tuning. \u0421\u0435\u0439\u0447\u0430\u0441 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 Buffer Pool: \u043f\u043e\u0447\u0435\u043c\u0443 Clock-sweep \u043b\u0443\u0447\u0448\u0435 LRU \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043a\u0430\u043a BufferRing \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u043a\u0430\u043d\u044b \u043e\u0442 \u0433\u043e\u0440\u044f\u0447\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 no-steal \u044d\u0442\u043e \u043d\u0435 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0438\u043b\u044f, \u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 recovery.<\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u043e\u0434\u0435, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a MVP, \u0433\u0434\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u2014 \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u044f\u043c\u043e. <strong>\u0417\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u0438<\/strong> \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f sharded buffer pool, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b GCLOCK \/ CLOCK-Pro \/ ARC, \u043f\u043e\u043b\u043d\u044b\u0439 Resource Broker \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 bulk write \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0432\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.<\/p>\n<p><strong>\u0427\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438:<\/strong> Clock-sweep \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c BufferPool; BufferRing (BulkRead path) \u0432 <code>HeapStore::seq_scan_with_strategy<\/code>; BackpressureCoordinator \u0441 \u0442\u0440\u0435\u043c\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f; \u0432\u0441\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0437 \u00a77. <strong>\u0427\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e:<\/strong> SQL-\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>seq_scan<\/code> \u043d\u0430 BulkRead \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438; \u0441\u0447\u0451\u0442\u0447\u0438\u043a <code>clock_sweep_evictions_total<\/code> \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0443\u043b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d.<\/p>\n<hr\/>\n<h3>1. Cache pollution: \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0438\u0432\u043d\u0430\u044f LRU \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u043d\u0430 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435<\/h3>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u0443\u044e \u0431\u0430\u0437\u0443 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c LRU. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c OLTP-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: 99% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, hot working set \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u0432 Buffer Pool, hit ratio \u043f\u043e\u0434 99%, p99 latency \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f. \u0418 \u0442\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u0439 <code>SELECT count(*) FROM orders<\/code> \u0438\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0447\u0451\u0442\u043e\u0432 \u0438\u0437 BI-\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p>\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 LRU-\u043a\u044d\u0448\u0435\u043c:<\/p>\n<ol>\n<li>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0430\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 Buffer Pool.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u00ab\u0441\u0432\u0435\u0436\u0430\u044f\u00bb, LRU \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0451 \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0438\u0441\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p>Hot OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0440\u043d\u0438 B-tree-\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432) \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u044d\u0432\u0438\u043a\u0442\u044f\u0442\u0441\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d\u0430 hit ratio \u0440\u0435\u0437\u043a\u043e \u043f\u0430\u0434\u0430\u0435\u0442, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0438\u0434\u0442\u0438 \u0432 I\/O, p99 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a-\u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0432\u0432\u0435\u0440\u0445.<\/p>\n<\/li>\n<\/ol>\n<p>\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <strong>cache pollution<\/strong>. \u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0432 \u043d\u0451\u043c \u044d\u0442\u043e \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u044f: \u043e\u0434\u0438\u043d \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0441 \u043e\u0434\u043d\u0438\u043c \u00ab\u043d\u0435\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u00bb \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u044c tail latency \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e OLTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u2014 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0439\u043c\u0451\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0432 hot working set \u0437\u0430\u043d\u043e\u0432\u043e \u0447\u0435\u0440\u0435\u0437 random reads \u0441 \u0434\u0438\u0441\u043a\u0430.<\/p>\n<p>\u041a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e LRU \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u00ab\u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u0441\u043a\u043e\u0440\u043e \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f\u00bb (recency = utility). \u0414\u043b\u044f OLTP \u0441 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u041f\u0430\u0440\u0435\u0442\u043e (20% \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 80% \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439) \u044d\u0442\u043e \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0432\u0435\u0440\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0430 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430, \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0435\u0451 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. LRU \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0438 (intent) \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0444\u0430\u043a\u0442.<\/p>\n<p>\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0434\u0432\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438:<\/p>\n<ol>\n<li>\n<p>\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044d\u0432\u0438\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u0435\u043d \u043a \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 (\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435 LRU \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0430\u0442\u044c \u0441\u043a\u0430\u043d\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448-\u043c\u0430\u0440\u0448\u0440\u0443\u0442 (cache bypass), \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0431\u043e\u0440\u0443.<\/p>\n<\/li>\n<\/ol>\n<p>\u041e\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0438\u0445 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438.<\/p>\n<hr\/>\n<h3>2. Clock-sweep: \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0436\u0435\u0440\u0442\u0432\u0443<\/h3>\n<p>\u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e Buffer Pool \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 <strong>Clock-sweep<\/strong> (\u043e\u043d \u0436\u0435 CLOCK, second-chance). \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430, \u043e\u0431\u043a\u0430\u0442\u0430\u043d\u043d\u0430\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0432 PostgreSQL \u0438 BSD VM, \u0438 \u043e\u043d\u0430 \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p><strong>\u0414\u0435\u0448\u0451\u0432\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0438 \u0432 \u043a\u044d\u0448<\/strong>. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0431\u0438\u0442 (<code>ref_bit = true<\/code>). \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0443\u0437\u043b\u043e\u0432 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u043a\u0430\u043a \u0443 honest LRU.<\/p>\n<\/li>\n<li>\n<p><strong>\u042d\u0432\u0438\u043a\u0446\u0438\u044f \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430<\/strong>. \u0416\u0435\u0440\u0442\u0432\u0430 \u0438\u0449\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043b\u0430\u0442\u0438\u043c \u0437\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f LRU<\/strong>. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0447\u0430\u0441\u0442\u043e, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u00ab\u0441\u0442\u0440\u0435\u043b\u043a\u0438\u00bb \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b, \u043a\u0430\u043a \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 LRU.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c <code>BufferPool<\/code> \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e: \u0441\u043b\u043e\u0432\u0430\u0440\u044c <code>pages: HashMap&lt;PageId, Page&gt;<\/code>, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 <code>frames: Vec&lt;PageId&gt;<\/code> (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u00ab\u0446\u0438\u0444\u0435\u0440\u0431\u043b\u0430\u0442\u0430\u00bb) \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0438 <code>clock_hand: usize<\/code>. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0441\u0442\u044c <code>ref_bit<\/code>, <code>pin_count<\/code> \u0438 \u0444\u043b\u0430\u0433 <code>dirty<\/code>. \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u044d\u0432\u0438\u043a\u0446\u0438\u0438 (\u0441\u043c. \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e):<\/p>\n<pre><code class=\"rust\">fn evict_for_insert(&amp;mut self, max_cached_pages: usize) {    \/\/ ...    let mut scans_left = self.frames.len().saturating_mul(4).max(1);    while evicted &lt; to_evict &amp;&amp; scans_left &gt; 0 &amp;&amp; !self.frames.is_empty() {        scans_left -= 1;        if self.clock_hand &gt;= self.frames.len() { self.clock_hand = 0; }        let pid = self.frames[self.clock_hand];        let p = self.pages.get_mut(&amp;pid).unwrap();        \/\/ Second chance: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \"\u0433\u043e\u0440\u044f\u0447\u0430\u044f\", \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0431\u0438\u0442 \u0438 \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435.        if p.ref_bit {            p.ref_bit = false;            self.clock_hand = (self.clock_hand + 1) % self.frames.len();            continue;        }        \/\/ \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0435\u043c pinned\/dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (no-evict-dirty \u043d\u0430 eviction-\u043f\u0443\u0442\u0438).        if p.pin_count != 0 || p.dirty {            self.clock_hand = (self.clock_hand + 1) % self.frames.len();            continue;        }        \/\/ \u042d\u0432\u0438\u043a\u0446\u0438\u044f.        self.pages.remove(&amp;pid);        self.frame_remove(pid);        evicted += 1;    }}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ol>\n<li>\n<p><strong>Bounded scan<\/strong>. \u041b\u0438\u043c\u0438\u0442 <code>frames.len() * 4<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043d\u044f\u0442\u044b (pinned \u0438\u043b\u0438 dirty). \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432 \u0432\u0441\u0435 \u043c\u0435\u0441\u0442\u0430, \u0438 \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 backpressure (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).<\/p>\n<\/li>\n<li>\n<p><strong>No-evict-dirty<\/strong>. <code>dirty<\/code> \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0436\u0435\u0440\u0442\u0432\u043e\u0439: \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u0438 flush \u044d\u0442\u043e <strong>\u0440\u0430\u0437\u043d\u044b\u0435<\/strong> \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b, \u0438 \u043e\u043d\u0438 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b (\u0441\u043c. \u00a75). \u0412\u0430\u0436\u043d\u043e\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u044d\u0442\u043e <strong>\u043d\u0435<\/strong> \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <strong>no-steal<\/strong> \u2014 \u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043d\u0435\u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a flush-\u043f\u0443\u0442\u0438, \u0430 \u043d\u0435 \u043a eviction-\u043f\u0443\u0442\u0438 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u00a74.2). \u0412 \u043d\u0430\u0448\u0435\u043c MVP \u043e\u0431\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: <strong>no-evict-dirty<\/strong> \u043d\u0430 eviction-\u043f\u0443\u0442\u0438 \u0438 <strong>no-steal<\/strong> \u043d\u0430 flush-\u043f\u0443\u0442\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Pin count \u043a\u0430\u043a hard barrier<\/strong>. \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u043b\u043e\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0435\u0451 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u044d\u0432\u0438\u043a\u0446\u0438\u0438, \u0442\u043e\u0447\u043a\u0430.<\/p>\n<\/li>\n<\/ol>\n<h4>2.1. \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Clock, \u0430 \u043d\u0435 GCLOCK \/ CLOCK-Pro \/ ARC<\/h4>\n<p>\u0427\u0435\u0441\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442: \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e <strong>MVP-\u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f correctness-first \u0444\u0430\u0437\u044b<\/strong>. Clock \u0434\u0430\u0451\u0442 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u0440\u043e\u0434\u0435 GCLOCK (\u0441 usage_count &gt; 1) \u0438\u043b\u0438 CLOCK-Pro (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446) \u0434\u0430\u044e\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 hit ratio \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u0434\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c property-based \u043d\u0430 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.<\/p>\n<p>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0430 \u0434\u043e GCLOCK \u0438\u043b\u0438 CLOCK-Pro \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u0438 \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 trace-\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>evict_for_insert<\/code>. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043b\u044e\u0431\u043e\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u044b\u043b\u043e \u0431\u044b premature optimization.<\/p>\n<p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f: basic CLOCK \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c OLTP-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u041f\u0430\u0440\u0435\u0442\u043e, \u043d\u043e \u043d\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445 \u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, time-series \u0441 rolling window) CLOCK-Pro \u0434\u0430\u0451\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0439 hit ratio \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0435 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb \u0438 \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0435 \u0435\u0449\u0451 \u043d\u0435\u0434\u0430\u0432\u043d\u043e\u00bb. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u043f\u043e\u043a\u0430\u0436\u0443\u0442 trace-\u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<h4>2.2. \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0440\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0441\u044c <code>BufferPool<\/code> \u0436\u0438\u0432\u0451\u0442 \u0437\u0430 \u0435\u0434\u0438\u043d\u044b\u043c <code>Mutex<\/code> \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 <code>StorageEngine<\/code>. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f MVP: \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c, \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u044f\u0434\u0435\u0440 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (sharded buffer pool \u0441 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 CLOCK-\u0441\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u043d\u0430 \u0448\u0430\u0440\u0434, \u043a\u0430\u043a \u0432 InnoDB), \u0438 \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433. \u041d\u043e \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438 (\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0440\u0434\u0430\u043c\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0434\u0440\u043e\u043f-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 per-shard), \u0438 \u0435\u0451 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437. \u041f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0443\u043f\u0451\u0440\u043b\u0438\u0441\u044c \u0432 <code>Mutex<\/code> \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445, \u043c\u044b \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0440\u043e\u0433, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c mutex \u043d\u0430 Buffer Pool \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u043c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f read\/write, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438 scheduler affinity \u2014 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 8 \u0438 32+ \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0438 \u043e\u043d\u0430 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 dirty-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u043f\u0443\u043b\u0435.<\/p>\n<hr\/>\n<h3>3. BufferRing: cache bypass \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u043e\u0432<\/h3>\n<p>Clock-sweep \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 <strong>\u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442<\/strong> \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 cache pollution. \u041e\u043d \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0436\u0435\u0440\u0442\u0432\u044b \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0447\u0435\u043c \u0443 LRU. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d \u043d\u0430\u0442\u0430\u0449\u0438\u0442 \u0432 \u043f\u0443\u043b \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 <code>ref_bit = true<\/code>, \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c\u0438 \u043d\u0430 \u044d\u0432\u0438\u043a\u0446\u0438\u044e, \u0438 \u0432 \u044d\u0442\u0443 \u0436\u0435 \u044d\u0432\u0438\u043a\u0446\u0438\u044e \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0445\u043e\u0442-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <code>ref_bit<\/code> \u0442\u043e\u0436\u0435 \u0443\u0441\u043f\u0435\u043b \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0430\u043d\u044b \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, <code>BufferRing<\/code>. \u042d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 32 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [4, 256]), \u043a\u0443\u0434\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438 \u0441\u043a\u0430\u043d\u0430\u0445 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 <code>BufferAccessStrategy::BulkRead<\/code>. \u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<pre><code>BufferAccessStrategy    \u2502    \u251c\u2500 Normal   \u2500\u2500\u25b6  BufferPool   CLOCK-sweep \u00b7 pin \/ unpin \u00b7 no-steal    \u2502                    \u2502    \u2514\u2500 BulkRead \u2500\u2500\u25b6  BufferRing   32 \u0441\u043b\u043e\u0442\u0430 FIFO \u00b7 read-only \u00b7 \u0441\u0432\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0430\u043d                         \u2502                   \u0414\u0438\u0441\u043a\u043e\u0432\u044b\u0439 I\/O<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Hot OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0443\u043b\u0435 \u0438 \u043d\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u044e\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0434\u0451\u0442 full table scan. \u0421\u043a\u0430\u043d\u044b \u043a\u0440\u0443\u0442\u044f\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043a\u043e\u043b\u044c\u0446\u0435 \u0438 \u044d\u0432\u0438\u043a\u0442\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.<\/p>\n<pre><code class=\"rust\">pub enum BufferAccessStrategy {    \/\/\/ \u041e\u0431\u044b\u0447\u043d\u044b\u0439 OLTP-\u0434\u043e\u0441\u0442\u0443\u043f: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 BufferPool.    Normal,    \/\/\/ Bulk read: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 BufferRing,    \/\/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u043b \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c.    BulkRead,    \/\/\/ Bulk write (\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0434 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 COPY\/INSERT batch).    BulkWrite,}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>Ring \u0443\u0441\u0442\u0440\u043e\u0435\u043d \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: <code>HashMap&lt;PageId, Vec&lt;u8&gt;&gt;<\/code> \u0438 <code>VecDeque&lt;PageId&gt;<\/code> \u0434\u043b\u044f FIFO-\u043f\u043e\u0440\u044f\u0434\u043a\u0430. \u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0430\u043c\u0443\u044e \u0441\u0442\u0430\u0440\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 (FIFO eviction), \u0431\u0435\u0437 \u0437\u0430\u043f\u0438\u0441\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043a\u0430\u043d\u0430 read-only \u043f\u043e \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 scan \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0439 ring, \u043d\u0438\u043a\u0430\u043a\u043e\u0439 shared mutability, \u0447\u0442\u043e \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u043a\u043b\u0430\u0441\u0441 \u0431\u0430\u0433\u043e\u0432 \u0441 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e.<\/p>\n<p>\u0421\u0430\u043c <code>seq_scan_with_strategy(BulkRead)<\/code> \u0442\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 <strong>streaming-\u0440\u0435\u0436\u0438\u043c\u0435<\/strong>: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f on-demand \u0447\u0435\u0440\u0435\u0437 <code>StreamingRingPageProvider<\/code> \u0438 \u043f\u0440\u043e\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0438\u0442\u0435\u0440\u0430\u0442\u043e\u0440\u0443, \u043d\u0435 \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044f\u0441\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u0412 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u0440\u0430\u043d\u043d\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 ring \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u043f\u0440\u0435\u0434\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0435\u0441\u044c \u0441\u043a\u0430\u043d \u0438 \u043f\u0430\u0434\u0430\u043b \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u0441 \u043f\u043e\u0442\u0435\u0440\u0435\u0439 \u0445\u0432\u043e\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446; \u044d\u0442\u043e \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u043e property-\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.<\/p>\n<p>\u041a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f property-\u0442\u0435\u0441\u0442\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><code>ring_size<\/code> &lt; 4 \u0438\u043b\u0438 &gt; 256: clamping \u0441 warning-\u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0432 \u043b\u043e\u0433 (fail-safe, \u043d\u0435 fail-closed: \u0441\u043a\u0430\u043d \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c).<\/p>\n<\/li>\n<li>\n<p>\u0414\u0443\u0431\u043b\u0438\u0440\u0443\u044e\u0449\u0430\u044f \u0432\u0441\u0442\u0430\u0432\u043a\u0430 \u0442\u043e\u0439 \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: no-op (\u043d\u0435\u043b\u044c\u0437\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u0432\u044b\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438 \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u043a\u0430\u043d\u0435).<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0437 ring <strong>\u043d\u0438\u043a\u043e\u0433\u0434\u0430<\/strong> \u043d\u0435 \u0443\u0442\u0435\u043a\u0430\u044e\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u043b \u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442.<\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438: <code>buffer_ring_evictions_total<\/code> (FIFO-\u044d\u0432\u0438\u043a\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0434\u043d\u043e\u0433\u043e ring), <code>buffer_ring_active_slots<\/code> (\u0430\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0451\u043c\u043a\u043e\u0441\u0442\u044c \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c ring-\u0431\u0443\u0444\u0435\u0440\u0430\u043c \u0432 \u0438\u043d\u0441\u0442\u0430\u043d\u0441\u0435) \u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 <code>buffer_ring_created_total<\/code> \/ <code>buffer_ring_dropped_total<\/code>. \u041f\u043e \u043d\u0438\u043c \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0438\u0434\u0438\u0442 \u0438 \u0434\u043e\u043b\u0433\u043e\u0436\u0438\u0432\u0443\u0449\u0438\u0435 \u043f\u0440\u043e\u0442\u0435\u0447\u043a\u0438 ring-\u0431\u0443\u0444\u0435\u0440\u043e\u0432 (<code>created<\/code> \u0441\u0438\u043b\u044c\u043d\u043e \u043e\u043f\u0435\u0440\u0435\u0436\u0430\u0435\u0442 <code>dropped<\/code>), \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u044e \u0437\u0430 \u0441\u043b\u043e\u0442\u044b \u043f\u043e\u0434 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439.<\/p>\n<h4>3.1. \u0427\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0433\u043e\u0432\u043e\u0440\u043a\u0430: \u0433\u0434\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u0435\u0439\u0447\u0430\u0441<\/h4>\n<p>\u0412 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043a\u043e\u0434\u0435 \u044f\u0434\u0440\u0430 ring \u0443\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u0432 <code>HeapStore::seq_scan_with_strategy(BulkRead)<\/code>. \u041e\u0434\u043d\u0430\u043a\u043e SQL-\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u0441\u0435\u0439\u0447\u0430\u0441 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u043b. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 <code>BulkRead<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0443\u0434\u0435\u0442 \u0432\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u2014 \u0441 \u044d\u0432\u0440\u0438\u0441\u0442\u0438\u043a\u043e\u0439 \u00ab\u0435\u0441\u043b\u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u043e\u0431\u044a\u0451\u043c \u0441\u043a\u0430\u043d\u0430 &gt; X% \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043f\u0443\u043b\u0430, \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043d\u0430 BulkRead\u00bb. \u042d\u0442\u043e \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0433\u0434\u0430 \u043d\u0438\u0436\u043d\u0438\u0439 \u0441\u043b\u043e\u0439 \u0434\u0432\u0438\u0436\u043a\u0430 \u0433\u043e\u0442\u043e\u0432 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u043d\u0430\u0443\u0447\u0438\u0442\u0441\u044f \u0438\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f; \u043c\u044b \u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 \u0438 \u0444\u0443\u043d\u0434\u0430\u043c\u0435\u043d\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u0443.<\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u043b\u044f \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0445\u043e\u043b\u043e\u0434\u043d\u044b\u0445 \u0447\u0442\u0435\u043d\u0438\u0439 \u0432 \u043d\u0430\u0448\u0435\u043c <code>StorageEngine<\/code> \u0435\u0441\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c: <code>read_page_bytes_verify<\/code> \u0447\u0438\u0442\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0441 \u0434\u0438\u0441\u043a\u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440 \u0438 <strong>\u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0451 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 BufferPool<\/strong>, \u0435\u0441\u043b\u0438 \u0435\u0451 \u0442\u0430\u043c \u043d\u0435 \u0431\u044b\u043b\u043e. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u043d\u0430\u043c \u0435\u0449\u0451 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443 cache bypass \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u043d\u0438\u0436\u043d\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435 I\/O, \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u043d\u043e\u0432\u0430\u044f \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u044f. \u0418\u0434\u0435\u044f \u0442\u0430 \u0436\u0435: \u00ab\u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0438 \u0437\u0430\u0431\u044b\u043b\u00bb, \u0431\u0435\u0437 \u043f\u043e\u0431\u043e\u0447\u043d\u043e\u0433\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u043d\u0430 hot working set.<\/p>\n<h4>3.2. \u0422\u0440\u0438 bypass-\u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0430: \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0441\u0432\u043e\u0439\u0441\u0442\u0432<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041c\u0430\u0440\u0448\u0440\u0443\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u0430\u0434\u0435\u0432\u0430\u0435\u0442 hot working set?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0418\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 <code>buffer_pool_miss_total<\/code>?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041c\u043e\u0436\u0435\u0442 \u0432\u044b\u0437\u0432\u0430\u0442\u044c pollution?<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438?<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>seq_scan<\/code> (Normal)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 \u2014 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0434\u0443\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u043b<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430, \u043f\u0443\u0442\u044c \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>seq_scan_with_strategy(BulkRead)<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 \u2014 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 BufferRing<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\"><strong>\u041d\u0435\u0442<\/strong> \u2014 \u044f\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0431\u043e\u0440 \u0432 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>read_page_bytes_verify<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442 \u2014 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0431\u0443\u0444\u0435\u0440, \u0432 \u043f\u0443\u043b \u043d\u0435 \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0435\u0442<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430 \u2014 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0438 \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u0442\u0435\u043b\u0435\u043c\u0435\u0442\u0440\u0438\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<hr\/>\n<h3>4. Pinning, RAII \u0438 no-steal: \u043f\u043e\u0447\u0435\u043c\u0443 \u043c\u044b \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u044d\u0432\u0438\u043a\u0442\u0438\u043c dirty<\/h3>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0439 \u043a\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, \u0434\u0435\u043b\u0430\u0435\u0442 \u044d\u0442\u043e \u0447\u0435\u0440\u0435\u0437 <code>PinnedPage&lt;'a&gt;<\/code>, RAII-\u043e\u0431\u0451\u0440\u0442\u043a\u0443 \u043d\u0430\u0434 \u043f\u0438\u043d\u043e\u043c. \u0421\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430:<\/p>\n<pre><code class=\"rust\">let page = engine.pin_page(page_id);\/\/ ...\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439...\/\/ Drop \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442 pin_count.<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u043f\u0438\u043d\u043d\u0438\u043d\u0433 \u0432 Buffer Pool \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442 \u0440\u0435\u0444\u043a\u0430\u0443\u043d\u0442\u0430, \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0440\u0435\u0436\u0438\u043c\u043e\u0432 Shared \u0438\u043b\u0438 Exclusive. \u041b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u0436\u0438\u0432\u0443\u0442 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u044b\u0448\u0435, \u0432 <code>LockManager<\/code>, \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043a \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044f\u043c, \u0430 \u043d\u0435 \u043a \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438. \u041f\u0438\u043d\u043d\u0438\u043d\u0433 \u0438 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438 \u0440\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438: \u043f\u0438\u043d\u043d\u0438\u043d\u0433 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0442 \u0432\u044b\u0442\u0435\u0441\u043d\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0443\u043b\u0430 \u043f\u043e\u043a\u0430 \u0441 \u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u0430 LockManager \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439.<\/p>\n<p>\u041f\u043e\u043a\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u043e\u043a \u0434\u0435\u0440\u0436\u0438\u0442 <code>PinnedPage<\/code>, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u043d\u0435\u043f\u0440\u0438\u043a\u043e\u0441\u043d\u043e\u0432\u0435\u043d\u043d\u0430 \u0434\u043b\u044f \u044d\u0432\u0438\u043a\u0446\u0438\u0438: <code>evict_for_insert<\/code> \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0435\u0451 \u043f\u043e <code>pin_count != 0<\/code>. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430: \u043f\u043e\u043a\u0430 \u0432\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u0435 \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u0440\u043d\u0443\u0442\u044c \u0435\u0451 \u0438\u0437-\u043f\u043e\u0434 \u0432\u0430\u0441 \u0438 \u043f\u043e\u0434\u043c\u0435\u043d\u0438\u0442\u044c \u0431\u0430\u0439\u0442\u044b.<\/p>\n<h4>4.1. \u042d\u0432\u0438\u043a\u0446\u0438\u044f \u0438 flush: \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b<\/h4>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e <code>pin_count<\/code>, \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432 <code>eligible_to_flush<\/code> (\u0434\u043b\u044f writeback) \u0438 \u0432 <code>evict_for_insert<\/code> (\u0434\u043b\u044f \u044d\u0432\u0438\u043a\u0446\u0438\u0438). \u041e\u043d\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0435\u043a\u0430\u044e\u0442\u0441\u044f, \u043d\u043e \u0440\u0435\u0448\u0430\u044e\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438:<\/p>\n<ul>\n<li>\n<p><strong>\u042d\u0432\u0438\u043a\u0446\u0438\u044f<\/strong> \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c pinned \u0418\u041b\u0418 dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0422\u043e, \u0447\u0442\u043e \u043c\u044b \u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0435\u043c dirty \u0431\u0435\u0437 \u0437\u0430\u043f\u0438\u0441\u0438, \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c: \u0438\u043d\u0430\u0447\u0435 \u043c\u044b \u043f\u043e\u0442\u0435\u0440\u044f\u043b\u0438 \u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0447\u0442\u043e \u0433\u0440\u044f\u0437\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0439\u0442\u0438 \u0447\u0435\u0440\u0435\u0437 Checkpoint Worker (\u0438\u043b\u0438 \u044f\u0432\u043d\u044b\u0439 <code>flush_some_eligible<\/code>), \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e <code>fsync<\/code> WAL \u0438 <code>pwrite<\/code> \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u043d\u0430 \u0441\u043d\u043e\u0432\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u043e\u043c \u043d\u0430 \u044d\u0432\u0438\u043a\u0446\u0438\u044e.<\/p>\n<\/li>\n<li>\n<p><strong>Flush<\/strong> \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0435\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0438\u0437 \u0443\u0441\u043b\u043e\u0432\u0438\u0439: <code>pin_count != 0<\/code>, \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0435\u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, <code>page_lsn &gt; txlog_durable_lsn<\/code> (\u043d\u0430\u0440\u0443\u0448\u0435\u043d\u0438\u0435 WAL-before-data) \u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e\u0434 backup fence.<\/p>\n<\/li>\n<\/ul>\n<h4>4.2. No-steal \u0447\u0435\u0440\u0435\u0437 O(1) \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 HashSet<\/h4>\n<p>\u0412\u0442\u043e\u0440\u043e\u0439 \u043f\u0443\u043d\u043a\u0442 \u0438\u0437 \u0441\u043f\u0438\u0441\u043a\u0430 \u0432\u044b\u0448\u0435 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 <strong>no-steal<\/strong> \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u043e\u0432 \u043f\u043e \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u043c \u0411\u0414. \u0422\u043e\u0447\u043d\u043e\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 no-steal: \u0433\u0440\u044f\u0437\u043d\u044b\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0435\u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u044b\u0445 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a. \u0417\u0430\u0447\u0435\u043c: \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0435\u0445\u0430\u043b\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a, \u0430 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f \u043f\u043e\u0442\u043e\u043c \u043e\u0442\u043a\u0430\u0442\u0438\u043b\u0430\u0441\u044c \u0438\u043b\u0438 \u0443\u043f\u0430\u043b\u0430, \u043d\u0430 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c UNDO \u043a \u0434\u0430\u043d\u043d\u044b\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043f\u0438\u0441\u0430\u043d\u044b, \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0445\u0435\u043c\u044b recovery (\u0432 \u0441\u0442\u0438\u043b\u0435 ARIES \u0441 UNDO-\u0444\u0430\u0437\u043e\u0439, \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u043b\u044f \u0448\u0442\u0430\u0442\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430).<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 no-steal \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439 \u0432 <code>eligible_to_flush<\/code>:<\/p>\n<pre><code class=\"rust\">if uncommitted_pages.contains(&amp;pid) {    return Err(FlushSkipReason::Uncommitted);}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p><code>uncommitted_pages<\/code> \u044d\u0442\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 <code>HashSet&lt;PageId&gt;<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0435\u0439\u0434\u0436\u0438\u043d\u0433-\u0437\u0430\u043f\u0438\u0441\u0438 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0440\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0438\u043b\u0438 \u043e\u0442\u043a\u0430\u0442\u0435. \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 flush-\u0446\u0438\u043a\u043b\u0430 \u044d\u0442\u043e O(1). \u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 (\u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c <code>pending_by_txn<\/code> \u043f\u043e \u0432\u0441\u0435\u043c \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u043c) \u0431\u044b\u043b \u0431\u044b O(N_txns) \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0445\u0443\u0436\u0435 \u043f\u043e\u0434 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0447\u0438\u0441\u043b\u043e\u043c \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439. \u0420\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0447\u0451\u0442\u043a\u043e \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0430: \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0441\u043b\u043e\u0439 \u0432\u0435\u0434\u0451\u0442 \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0443 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, \u0430 flush-\u043f\u0443\u0442\u044c \u0435\u0451 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0442\u0430\u0435\u0442.<\/p>\n<p>\u0417\u0430\u0447\u0435\u043c \u043d\u0430\u043c no-steal: \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u0430\u044f \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u0430 \u2014 steal-with-sync-flush \u2014 \u043e\u0437\u043d\u0430\u0447\u0430\u043b\u0430 \u0431\u044b, \u0447\u0442\u043e \u0432 \u043d\u0430\u0448\u0435\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0439 fsync \u0432 \u0442\u043e\u043c \u0436\u0435 \u043f\u043e\u0442\u043e\u043a\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c <code>SELECT<\/code>. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043c\u0438\u043a\u0440\u043e\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043f\u0440\u044f\u0447\u0443\u0442\u0441\u044f \u043f\u043e\u0434 \u0441\u0440\u0435\u0434\u043d\u0435\u0439 \u043b\u0430\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0443\u0431\u0438\u0439\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043b\u0438\u044f\u044e\u0442 \u043d\u0430 p99\/p99.9. \u041c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u043f\u043e\u0442\u043e\u043a \u00ab\u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u00bb \u0441\u0442\u0430\u043b backpressure-\u0430\u0433\u0435\u043d\u0442\u043e\u043c \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0433\u043e checkpoint.<\/p>\n<p>\u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u0442\u043e\u0438\u0442 \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432 \u0433\u043e\u043b\u043e\u0432\u0435: no-steal \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0441\u0432\u043e\u0451 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u0434\u043b\u0438\u043d\u043d\u044b\u0445 batch-\u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u044f\u0445 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c uncommitted write-set \u2014 \u043f\u0443\u043b \u0431\u044b\u0441\u0442\u0440\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f dirty-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u0432\u0441\u0442\u0430\u0451\u0442, \u0438 backpressure \u0443\u0434\u0430\u0440\u044f\u0435\u0442 \u0443\u0436\u0435 \u043f\u043e \u043d\u043e\u0432\u044b\u043c \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u043c, \u0430 \u043d\u0435 \u043f\u043e background flush. \u042d\u0442\u043e \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441, \u0430 \u043d\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430.<\/p>\n<hr\/>\n<h3>5. Checkpoint vs eviction: \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 Unified Storage \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0434\u0435\u043b\u043e<\/h3>\n<p>\u0412 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0441 per-table \u0444\u0430\u0439\u043b\u0430\u043c\u0438 Checkpoint \u044d\u0442\u043e \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441 N \u0441\u0442\u0435\u043f\u0435\u043d\u044f\u043c\u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u044b: \u043a\u0430\u043a\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0444\u043b\u0430\u0448\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c\u0438, \u043a\u0430\u043a \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u0442\u044c I\/O \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u043c\u0438 \u0434\u0435\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0440\u0430\u043c\u0438, \u043a\u0430\u043a \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c write amplification, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441\u043e\u0441\u0435\u0434\u0441\u0442\u0432\u0443\u044e\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438, \u043d\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u0435\u0436\u0430\u0442 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445.<\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 Unified Storage (\u043e\u0431\u0449\u0438\u0439 \u0444\u043e\u0440\u043c\u0430\u0442, \u043e\u0431\u0449\u0438\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, \u0435\u0434\u0438\u043d\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0447\u0435\u0440\u0435\u0437 <code>PageId = [table_id:16][local_page_id:48]<\/code>) Checkpoint Worker \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443:<\/p>\n<ol>\n<li>\n<p>\u041e\u043d \u0431\u0435\u0440\u0451\u0442 <code>dirty_queue<\/code> \u0438\u0437 <code>BufferPool<\/code> (\u043c\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c \u0435\u0433\u043e \u043a\u0430\u043a \u043f\u043e\u0431\u043e\u0447\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443: <code>VecDeque&lt;PageId&gt;<\/code> \u043f\u043b\u044e\u0441 <code>HashSet<\/code> \u0434\u043b\u044f \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438).<\/p>\n<\/li>\n<li>\n<p>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 <code>eligible_to_flush<\/code> (WAL durable LSN, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0438\u043d\u0430, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 backup fence).<\/p>\n<\/li>\n<li>\n<p>\u0413\u0440\u0443\u043f\u043f\u0438\u0440\u0443\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443 tablespace \u0438 \u043f\u0438\u0448\u0435\u0442 \u0431\u0430\u0442\u0447\u0430\u043c\u0438 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c I\/O.<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u043e\u0442\u0434\u0430\u0451\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u0432 \u043e\u0431\u0449\u0438\u0439 \u043f\u0443\u043b, \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u043d\u0430 \u0441\u043d\u043e\u0432\u0430 clean \u0438 \u0441\u043d\u043e\u0432\u0430 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442 \u043d\u0430 \u044d\u0432\u0438\u043a\u0446\u0438\u044e.<\/p>\n<\/li>\n<\/ol>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0439 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043a\u0438, \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u00ab\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0441\u044c, \u043c\u0438\u0440, \u043f\u043e\u043a\u0430 \u044f \u0441\u043d\u0438\u043c\u0430\u044e \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u00bb. \u0427\u0435\u043a\u043f\u043e\u0438\u043d\u0442 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u044c \u0442\u043e\u0433\u043e \u0436\u0435 I\/O-\u0431\u044e\u0434\u0436\u0435\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0440\u0443\u043b\u0438\u0442 <code>IoAdvisor<\/code> (\u0441\u043c. \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0430\u0442\u044c\u044e): \u043f\u0440\u0438 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0438 \u043a \u043b\u0438\u043c\u0438\u0442\u0443 IOPS \u043e\u043d \u043f\u043b\u0430\u0432\u043d\u043e \u0442\u0440\u043e\u0442\u0442\u043b\u0438\u0442\u0441\u044f, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0443\u044e \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0443 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u043e\u043d\u043d\u044b\u0445 I\/O \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u0427\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u044d\u0442\u043e \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 <code>WAL-before-data<\/code>: \u043d\u0438 \u043e\u0434\u043d\u0430 dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0434\u0438\u0441\u043a \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0430\u044f WAL-\u0437\u0430\u043f\u0438\u0441\u044c \u0441\u0442\u0430\u043b\u0430 durable. \u042d\u0442\u043e\u0442 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0438\u043c\u0435\u043d\u043d\u043e \u0432 <code>eligible_to_flush<\/code>, \u0430 \u043d\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c writeback. \u0422\u0430\u043a\u043e\u0435 \u0440\u0430\u0437\u043d\u0435\u0441\u0435\u043d\u0438\u0435 \u0437\u0430\u0449\u0438\u0442\u044b \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u043a\u0442\u043e-\u0442\u043e \u043f\u043e \u043e\u0448\u0438\u0431\u043a\u0435 \u0432\u044b\u0437\u043e\u0432\u0435\u0442 <code>pwrite<\/code> \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u0435 \u043f\u0440\u043e\u0439\u0434\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u043c\u044b \u044d\u0442\u043e \u043f\u043e\u0439\u043c\u0430\u0435\u043c \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0440\u0430\u043d\u043d\u0435\u043c \u0448\u0430\u0433\u0435.<\/p>\n<hr\/>\n<h3>6. Backpressure: \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u043e\u0433\u0434\u0430 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u0431\u044b\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043c \u0434\u0438\u0441\u043a<\/h3>\n<p>\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e \u0432\u044b\u0440\u043e\u0441\u043b\u0430: dirty pages \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u044e\u0442\u0441\u044f, Checkpoint Worker \u043d\u0435 \u0443\u0441\u043f\u0435\u0432\u0430\u0435\u0442, \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u0439\u0442\u0438 clean+unpinned \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0451 \u043b\u0438\u0431\u043e dirty, \u043b\u0438\u0431\u043e pinned. \u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438?<\/p>\n<p>\u0411\u0435\u0437 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0446\u0438\u0438 \u2014 \u043d\u0438\u0447\u0435\u0433\u043e \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e. \u0418\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0432 storage-\u0441\u043b\u043e\u0435 \u0431\u044b\u043b\u043e \u0442\u0440\u0438 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043c\u0435\u0441\u0442\u0430, \u0433\u0434\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u00ab\u0434\u0430\u0432\u0438\u043b\u0430\u00bb \u043d\u0430 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439: \u043b\u0438\u043c\u0438\u0442 uncommitted-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 Buffer Pool, \u0433\u043b\u0443\u0431\u0438\u043d\u0430 I\/O-\u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 hard cap \u043d\u0430 <code>max_cached_pages<\/code>. \u041a\u0430\u0436\u0434\u043e\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0441\u0430\u043c\u043e \u043f\u043e \u0441\u0435\u0431\u0435, \u043a\u0430\u0436\u0434\u043e\u0435 \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u043e \u0441\u0432\u043e\u0435\u0439 \u043c\u0435\u0442\u0440\u0438\u043a\u043e\u0439. \u041a\u043e\u0433\u0434\u0430 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u0432\u0438\u0434\u0435\u043b \u0442\u043e\u0440\u043c\u043e\u0436\u0435\u043d\u0438\u0435, \u0443 \u043d\u0435\u0433\u043e \u043d\u0435 \u0431\u044b\u043b\u043e \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443\u00bb: \u043d\u0430\u0434\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0442\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u0430. \u042d\u0442\u043e \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u043f\u0440\u043e\u0432\u0430\u043b \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0441\u0435 \u0442\u0440\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430 \u0441\u0432\u0435\u0434\u0435\u043d\u044b \u0432 \u043e\u0434\u0438\u043d <code><strong>BackpressureCoordinator<\/strong><\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0442\u0440\u0435\u0439\u0442\u0430 <code>BackpressureSource<\/code>, \u043d\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u0442\u043e\u0447\u043a\u0443 \u0438 \u0440\u0435\u043f\u043e\u0440\u0442\u044f\u0442 \u0432 \u043e\u0434\u043d\u0443 \u043c\u0435\u0442\u0440\u0438\u043a\u0443 \u2014 \u0443 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430 \u0435\u0441\u0442\u044c \u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442 \u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u00ab\u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u0430\u0437\u0430 \u0441\u0435\u0439\u0447\u0430\u0441 \u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442 \u043c\u043e\u044e \u0437\u0430\u043f\u0438\u0441\u044c\u00bb.<\/p>\n<ol>\n<li>\n<p><code><strong>UncommittedPagesSource<\/strong><\/code>. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0434\u043e\u043b\u044e \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0441 uncommitted page-image deltas \u0441 \u043f\u043e\u0440\u043e\u0433\u043e\u043c <code>buffer_pool.uncommitted_pages_ratio_hard<\/code>. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Throttle<\/code> (\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>block<\/code>) \u0438\u043b\u0438 <code>Reject<\/code> (\u0432 \u0440\u0435\u0436\u0438\u043c\u0435 <code>fail_fast<\/code>). \u041b\u0443\u0447\u0448\u0435 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u044c\u0441\u044f, \u0447\u0435\u043c \u0432\u044b\u0439\u0442\u0438 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0441\u0445\u0432\u0430\u0442\u0438\u0442\u044c OOM.<\/p>\n<\/li>\n<li>\n<p><code><strong>WalQueueSource<\/strong><\/code>. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043b\u0443\u0431\u0438\u043d\u0443 high-priority I\/O-\u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u041a\u043e\u0433\u0434\u0430 demand-\u0447\u0442\u0435\u043d\u0438\u044f OLTP \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0435\u0451 \u043d\u0430\u0441\u044b\u0449\u0430\u0442\u044c, \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440 \u043e\u0431\u044a\u044f\u0432\u043b\u044f\u0435\u0442 <code>Throttle<\/code>, \u0438 \u043d\u0438\u0437\u043a\u043e\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043d\u044b\u0435 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0438 (prefetch, \u0444\u043e\u043d\u043e\u0432\u0430\u044f warm-up-\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430) \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0436\u0438\u043c\u0430\u044e\u0442\u0441\u044f. \u041b\u043e\u0433\u0438\u043a\u0430 \u043f\u0440\u043e\u0441\u0442\u0430: \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0436\u0434\u0451\u0442 I\/O, \u043d\u0438 \u043e\u0434\u0438\u043d \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u0439 prefetch \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 \u0441\u044a\u0435\u0441\u0442\u044c \u0435\u0433\u043e \u0441\u043b\u043e\u0442 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435.<\/p>\n<\/li>\n<li>\n<p><code><strong>BufferPoolSource<\/strong><\/code>. \u0412\u0432\u0435\u0434\u0451\u043d \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 hard cap \u043d\u0430 <code>max_cached_pages<\/code>. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>Throttle<\/code>, \u043a\u043e\u0433\u0434\u0430 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u043f\u0440\u0438\u043f\u0430\u0440\u043a\u043e\u0432\u0430\u043d \u043d\u0430 capacity-cv (condition variable \u2014 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0442 \u043f\u043e\u0442\u043e\u043a, \u043e\u0436\u0438\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043b\u043e\u0442\u0430 \u0432 \u043f\u0443\u043b\u0435), \u0438 <code>Reject<\/code>, \u043a\u043e\u0433\u0434\u0430 \u043f\u0443\u043b \u0443\u0448\u0451\u043b \u0432 degraded-\u0440\u0435\u0436\u0438\u043c (\u043b\u044e\u0431\u0430\u044f \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u044d\u0432\u0438\u043a\u0446\u0438\u0438 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0430 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e pinned \u043d\u0430\u0431\u043e\u0440 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u2014 \u044f\u0432\u043d\u044b\u0439 \u0441\u0438\u0433\u043d\u0430\u043b \u0443\u0442\u0435\u0447\u043a\u0438 \u043f\u0438\u043d\u043e\u0432).<\/p>\n<\/li>\n<\/ol>\n<p>\u0420\u0435\u0448\u0435\u043d\u0438\u044f \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u043e\u0440\u0430 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u043f\u043e \u0436\u0451\u0441\u0442\u043a\u043e\u043c\u0443 \u043f\u0440\u0430\u0432\u0438\u043b\u0443 <code>Reject &gt; Throttle &gt; Pass<\/code>: \u043b\u044e\u0431\u043e\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a, \u0433\u043e\u0432\u043e\u0440\u044f\u0449\u0438\u0439 \u00ab\u043e\u0442\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb, \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442. \u0412\u0441\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 Prometheus \u043a\u0430\u043a <code>backpressure_throttle_decisions_total{source, decision}<\/code> (\u0441\u0447\u0451\u0442\u0447\u0438\u043a) \u043f\u043b\u044e\u0441 <code>backpressure_active_sources<\/code> (gauge). \u0421\u0430\u043c\u043e \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043f\u043e\u0434 backpressure \u0440\u0430\u0437\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>WaitEvent::BackpressureThrottle<\/code> \u0432 \u043e\u0431\u0449\u0435\u0439 \u0442\u0430\u043a\u0441\u043e\u043d\u043e\u043c\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f (\u0441\u043c. \u00a77), \u0430 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0430 capacity-cv \u2014 <code>buffer_pool_waiter_wait_seconds<\/code>.<\/p>\n<p>\u042d\u0442\u0430 \u0441\u0445\u0435\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u044b\u043c \u0441\u043b\u0435\u0434\u0441\u0442\u0432\u0438\u0435\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0430 <strong>Restrictive by Default<\/strong> (\u043c\u044b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0432\u044b\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445): \u043a\u043e\u0433\u0434\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0443\u043f\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0435\u0441\u0443\u0440\u0441, \u043e\u043d\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0442\u0438\u0445\u043e \u0434\u0435\u0433\u0440\u0430\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u043d\u0430\u0434\u0435\u0436\u0434\u0435 \u00ab\u043a\u0430\u043a-\u043d\u0438\u0431\u0443\u0434\u044c \u0440\u0430\u0437\u0433\u0440\u0435\u0441\u0442\u0438\u00bb. \u041e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u043f\u0440\u0438\u0442\u043e\u0440\u043c\u043e\u0437\u0438\u0442\u044c \u0438 \u0433\u0440\u043e\u043c\u043a\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<hr\/>\n<h3>7. Observability: \u043a\u0430\u043a \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 Buffer Pool \u0441\u043d\u0430\u0440\u0443\u0436\u0438<\/h3>\n<p>\u041c\u0435\u0442\u0440\u0438\u043a\u0438 \u0440\u0430\u0437\u0431\u0438\u0442\u044b \u043d\u0430 \u0434\u0432\u0430 \u0441\u043b\u043e\u044f: <strong>\u0437\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043f\u0443\u043b\u0430<\/strong> (\u043a\u044d\u0448, dirty, \u044d\u0432\u0438\u043a\u0446\u0438\u044f) \u0438 <strong>backpressure \u0441 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f\u043c\u0438<\/strong> (\u043a\u0442\u043e \u0434\u0430\u0432\u0438\u0442 \u0438 \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0436\u0434\u0443\u0442).<\/p>\n<p><strong>\u0417\u0434\u043e\u0440\u043e\u0432\u044c\u0435 \u043f\u0443\u043b\u0430<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u043e\u043f\u0440\u043e\u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0430\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u043c \u0432 \u043a\u044d\u0448?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>buffer_pool_hit_total<\/code>, <code>_miss_total<\/code>, <code>_hit_ratio_milli<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Hit ratio \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u0434\u043e \u043f\u0440\u043e\u043c\u0438\u043b\u043b\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u043a\u044d\u0448\u0435?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>storage_cached_pages_total<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u0435\u043a\u0443\u0449\u0430\u044f \u0437\u0430\u043d\u044f\u0442\u043e\u0441\u0442\u044c \u043f\u0443\u043b\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0421\u043a\u043e\u043b\u044c\u043a\u043e dirty pages \u0436\u0434\u0443\u0442 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u0430?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>storage_dirty_pages_total<\/code>, <code>buffer_pool_uncommitted_dirty_pages<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u043e\u0434 flush<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041f\u0443\u043b \u0443\u0448\u0451\u043b \u0432 degraded-\u0440\u0435\u0436\u0438\u043c?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>buffer_pool_over_capacity_pages<\/code>, <code>_evict_failed_total<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u0442\u0440\u0430\u043d\u0438\u0446 \u00ab\u043d\u0430\u0434\u00bb hard cap; \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u0443\u0442\u043a\u043d\u0443\u043b\u0430\u0441\u044c \u0432 pinned-only \u043d\u0430\u0431\u043e\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043b\u0438 BulkRead \u0434\u043b\u044f \u0441\u043a\u0430\u043d\u043e\u0432?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>buffer_ring_evictions_total<\/code>, <code>_active_slots<\/code>, <code>_created_total<\/code>, <code>_dropped_total<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0410\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 BufferRing<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>Backpressure \u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f<\/strong><\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0412\u043e\u043f\u0440\u043e\u0441 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041c\u0435\u0442\u0440\u0438\u043a\u0430<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041a\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u0430\u0432\u0438\u0442 \u043d\u0430 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>backpressure_active_sources<\/code>, <code>_throttle_decisions_total{source,decision}<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u0430\u043a\u0438\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 <code>BackpressureCoordinator<\/code> \u0430\u043a\u0442\u0438\u0432\u043d\u044b \u0438 \u0432 \u043a\u0430\u043a\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435 (throttle \/ reject)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0414\u043e\u043b\u0433\u043e \u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0438 \u0436\u0434\u0443\u0442 \u0441\u043b\u043e\u0442\u0430 \u0432 \u043f\u0443\u043b\u0435?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>buffer_pool_waiter_wait_seconds<\/code> (\u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430)<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u043d\u0430 capacity-cv<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u041d\u0430 \u0447\u0442\u043e \u0436\u0434\u0443\u0442 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>wait_events_total{event}<\/code>, <code>_active{event}<\/code>, <code>_duration_seconds_bucket{event,le}<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0415\u0434\u0438\u043d\u0430\u044f \u0442\u0430\u043a\u0441\u043e\u043d\u043e\u043c\u0438\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439: <code>BufferPoolEviction<\/code>, <code>BackpressureThrottle<\/code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0435; total + active + \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>IoAdvisor<\/code>?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>io_advisor_current_batch_size<\/code>, <code>_decisions_total{action}<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">AIMD-\u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u044b\u0439 batch size \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u0430; \u0441\u0447\u0451\u0442\u0447\u0438\u043a throttle\/recover\/hold-\u0440\u0435\u0448\u0435\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">\u0411\u043b\u0438\u0437\u043a\u043e \u043b\u0438 \u043a \u043b\u0438\u043c\u0438\u0442\u0443 RAM?<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>memory_pressure_ratio<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">RSS, \u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043b\u0438\u043c\u0438\u0442 (<code>MemoryAdvisor<\/code> v0)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041f\u043e\u043c\u0438\u043c\u043e \u043c\u0435\u0442\u0440\u0438\u043a, \u0443 \u043d\u0430\u0441 \u043f\u043e-\u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 USDT-\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438. \u041b\u044e\u0431\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0447\u0435\u0440\u0435\u0437 <code>WaitEvent::PageRead<\/code> \u0438\u043b\u0438 <code>WaitEvent::PageWrite<\/code>, \u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0432 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c bpftrace, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u0440\u0436\u0435\u043a I\/O \u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445 \u043f\u0440\u044f\u043c\u043e \u043d\u0430 \u0436\u0438\u0432\u043e\u0439 \u0431\u0430\u0437\u0435:<\/p>\n<pre><code class=\"bash\">bpftrace -e 'usdt:\/usr\/bin\/oltp_server:engine:io_end { @io_lat = hist(arg1); }'<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<h4>7.1. \u041e\u0433\u043e\u0432\u043e\u0440\u043a\u0430 \u043f\u0440\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0438<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0443 \u043d\u0430\u0441 <strong>\u043d\u0435\u0442<\/strong> \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 <code>clock_sweep_evictions_total<\/code> \u0434\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430, \u043c\u044b \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u0440\u0438\u043a\u0438 ring eviction. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0435 \u0437\u043d\u0430\u0447\u0438\u043c\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u0441 production-style \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u044d\u0432\u0438\u043a\u0446\u0438\u0439 \u0438 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u043f\u0440\u043e\u0448\u043b\u0430 \u0441\u0442\u0440\u0435\u043b\u043a\u0430 \u0434\u043e \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0436\u0435\u0440\u0442\u0432\u044b\u00bb. \u0418\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c \u043a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0443\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u00ab\u0432\u043f\u0440\u0438\u0442\u044b\u043a\u00bb: \u0435\u0441\u043b\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u043e\u0431\u0445\u043e\u0434\u043e\u0432, \u0437\u043d\u0430\u0447\u0438\u0442, \u0443 \u043d\u0430\u0441 \u043c\u043d\u043e\u0433\u043e dirty\/pinned \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438 backpressure \u0443\u0436\u0435 \u0431\u043b\u0438\u0437\u043a\u043e.<\/p>\n<hr\/>\n<h3>8. \u0418\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0434\u043e\u043b\u0433<\/h3>\n<p>\u0422\u0440\u0438 \u043f\u0443\u043d\u043a\u0442\u0430 \u0437\u0430\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u0441\u0432\u044f\u0437\u0430\u043d\u044b \u0441 \u0442\u0435\u043c\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438:<\/p>\n<ul>\n<li>\n<p><strong>Sharded buffer pool<\/strong>. \u0415\u0434\u0438\u043d\u044b\u0439 <code>Mutex<\/code> \u2014 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 MVP-\u0432\u044b\u0431\u043e\u0440. \u0422\u0440\u0438\u0433\u0433\u0435\u0440 \u0434\u043b\u044f \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u0438\u0437\u043c\u0435\u0440\u0438\u043c\u044b\u0439 lock contention \u0432 perf-lab \u043d\u0430 32+ \u044f\u0434\u0440\u0430\u0445; \u043f\u043e\u043a\u0430 \u0435\u0433\u043e \u043d\u0435\u0442, \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<\/li>\n<li>\n<p><strong>Sub-pools per page size<\/strong>. <code>PageId = [table_id:16][local_page_id:48]<\/code> \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u0433\u043e\u0442\u043e\u0432 \u043a \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0430\u0431-\u043a\u044d\u0448\u0438, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 <code>PAGE_SIZE = 16384<\/code> \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><code><strong>clock_sweep_evictions_total<\/strong><\/code>. \u042d\u0442\u043e\u0433\u043e \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0435\u0449\u0451 \u043d\u0435\u0442 (\u0441\u043c. \u00a77.1). \u041e\u043d \u043d\u0443\u0436\u0435\u043d: \u0433\u0438\u0441\u0442\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u00ab\u0448\u0430\u0433\u043e\u0432 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u0434\u043e \u0436\u0435\u0440\u0442\u0432\u044b\u00bb \u2014 \u043b\u0443\u0447\u0448\u0438\u0439 \u0440\u0430\u043d\u043d\u0438\u0439 \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f backpressure.<\/p>\n<\/li>\n<\/ul>\n<hr\/>\n<h3>9. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h3>\n<p>Buffer Pool \u2014 \u043e\u0434\u043d\u043e \u0438\u0437 \u0442\u0435\u0445 \u043c\u0435\u0441\u0442, \u0433\u0434\u0435 \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442\u00bb \u0438 \u00ab\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u043f\u043e\u0434 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439\u00bb \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, 90% \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 OLTP-\u0434\u0432\u0438\u0436\u043a\u0430. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044d\u0432\u0438\u043a\u0446\u0438\u0438 \u0432 \u0443\u0447\u0435\u0431\u043d\u0438\u043a\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u043b\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b; \u043e\u0431\u0432\u044f\u0437\u043a\u0430 \u0432\u043e\u043a\u0440\u0443\u0433 \u043d\u0435\u0433\u043e (\u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044f \u0441\u043a\u0430\u043d\u043e\u0432, no-steal-\u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0447\u0435\u043a\u043f\u043e\u0438\u043d\u0442\u043e\u043c, backpressure, pin counts, RAII \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430) \u2014 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u044b\u0441\u044f\u0447 \u0441\u0442\u0440\u043e\u043a \u043a\u043e\u0434\u0430 \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043b\u043e\u0438 \u0442\u0435\u0441\u0442\u043e\u0432.<\/p>\n<p>\u0414\u043b\u044f MVP \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e: Clock-sweep \u0432\u043c\u0435\u0441\u0442\u043e CLOCK-Pro\/ARC, BufferRing \u0432\u043c\u0435\u0441\u0442\u043e \u0443\u043c\u043d\u044b\u0445 \u043f\u043e\u043b\u0438\u0442\u0438\u043a \u0432\u043d\u0443\u0442\u0440\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430, \u044f\u0432\u043d\u044b\u0439 no-steal \u0432\u043c\u0435\u0441\u0442\u043e steal-with-sync-flush, \u0435\u0434\u0438\u043d\u044b\u0439 <code>Mutex<\/code> \u0432\u043c\u0435\u0441\u0442\u043e \u0440\u0430\u043d\u043d\u0435\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b. \u041a\u0430\u0436\u0434\u044b\u0439 \u0432\u044b\u0431\u043e\u0440 \u2014 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u0439 \u043e\u0442\u043a\u0430\u0437 \u043e\u0442 \u00ab\u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e\u00bb \u0432 \u043f\u043e\u043b\u044c\u0437\u0443 \u00ab\u0434\u043e\u043a\u0430\u0437\u0443\u0435\u043c\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e\u00bb. \u041f\u0440\u0438\u043d\u0446\u0438\u043f \u043f\u0440\u043e\u0441\u0442: \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u0431\u0435\u0434\u0438\u0442\u044c\u0441\u044f, \u0447\u0442\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0434\u0443\u043c\u0430\u0442\u044c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u0435\u0435.<\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043f\u043b\u0430\u043d\u0443: \u043f\u0435\u0440\u0432\u044b\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u043d\u0430 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u00ab\u043f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0430\u043d \u043f\u043b\u044e\u0441 OLTP-\u0442\u0440\u0430\u0444\u0438\u043a\u00bb, \u0438\u043c\u0435\u043d\u043d\u043e \u0440\u0430\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0438 \u043f\u0438\u0441\u0430\u043b\u0441\u044f BufferRing. \u0417\u0430\u0442\u0435\u043c \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 SQL-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 PostgreSQL \u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e \u0442\u043e\u043c, \u043a\u0430\u043a Adaptive Tuning \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0435\u0436\u0434\u0443 Buffer Pool \u0438 \u043a\u044d\u0448\u0435\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0431\u0435\u0437 \u0440\u0430\u0437\u0440\u0443\u0448\u0435\u043d\u0438\u044f cache locality.<\/p>\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\/articles\/1030822\/\">https:\/\/habr.com\/ru\/articles\/1030822\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041e\u0434\u0438\u043d \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0441 \u043e\u0434\u043d\u0438\u043c SELECT count(*) FROM orders \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u044c p99 latency \u0432\u0441\u0435\u0433\u043e OLTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430. \u041f\u043e\u043a\u0430 \u0441\u043a\u0430\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439, Buffer Pool \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u00ab\u0445\u043e\u043b\u043e\u0434\u043d\u044b\u043c\u0438\u00bb \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u0433\u043e\u0440\u044f\u0447\u0438\u0435 OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0442\u0441\u044f, \u0438 \u043f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0442\u044f\u043d\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0434\u0438\u0441\u043a\u0430 \u0432\u043c\u0435\u0441\u0442\u043e \u043a\u044d\u0448\u0430 \u2014 \u0440\u043e\u0432\u043d\u043e \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 hot working set \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0435\u0435\u0442\u0441\u044f \u0437\u0430\u043d\u043e\u0432\u043e. \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 cache pollution, \u0438 \u0441 \u043d\u0438\u043c \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043b\u044e\u0431\u0430\u044f \u0421\u0423\u0411\u0414 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c LRU.\u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b\u0438 API-\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442\u044b \u043c\u0435\u0436\u0434\u0443 \u0441\u043b\u043e\u044f\u043c\u0438 OLTP-\u044f\u0434\u0440\u0430, USDT\/eBPF-\u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u043c\u043e\u0441\u0442\u044c \u0438 Adaptive Tuning. \u0421\u0435\u0439\u0447\u0430\u0441 \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 Buffer Pool: \u043f\u043e\u0447\u0435\u043c\u0443 Clock-sweep \u043b\u0443\u0447\u0448\u0435 LRU \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b, \u043a\u0430\u043a BufferRing \u0438\u0437\u043e\u043b\u0438\u0440\u0443\u0435\u0442 \u0441\u043a\u0430\u043d\u044b \u043e\u0442 \u0433\u043e\u0440\u044f\u0447\u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430, \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 no-steal \u044d\u0442\u043e \u043d\u0435 \u0432\u044b\u0431\u043e\u0440 \u0441\u0442\u0438\u043b\u044f, \u0430 \u0432\u043e\u043f\u0440\u043e\u0441 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 recovery.\u0417\u0434\u0435\u0441\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f: \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043a\u043e\u0434\u0435, \u043a\u0430\u043a\u0438\u0435 \u043a\u043e\u043c\u043f\u0440\u043e\u043c\u0438\u0441\u0441\u044b \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a MVP, \u0433\u0434\u0435 \u0447\u0442\u043e-\u0442\u043e \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e \u2014 \u0441\u043a\u0430\u0436\u0435\u043c \u043f\u0440\u044f\u043c\u043e. \u0417\u0430 \u0440\u0430\u043c\u043a\u0430\u043c\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f sharded buffer pool, \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b GCLOCK \/ CLOCK-Pro \/ ARC, \u043f\u043e\u043b\u043d\u044b\u0439 Resource Broker \u0441 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0435\u0440\u0435\u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 bulk write \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u2014 \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0443 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0432\u043e\u0439 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442.\u0427\u0442\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438: Clock-sweep \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c BufferPool; BufferRing (BulkRead path) \u0432 HeapStore::seq_scan_with_strategy; BackpressureCoordinator \u0441 \u0442\u0440\u0435\u043c\u044f \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430\u043c\u0438 \u0434\u0430\u0432\u043b\u0435\u043d\u0438\u044f; \u0432\u0441\u0435 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 \u0438\u0437 \u00a77. \u0427\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e: SQL-\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442 seq_scan \u043d\u0430 BulkRead \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438; \u0441\u0447\u0451\u0442\u0447\u0438\u043a clock_sweep_evictions_total \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0443\u043b\u0435 \u0435\u0449\u0451 \u043d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d.1. Cache pollution: \u043f\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0438\u0432\u043d\u0430\u044f LRU \u0443\u043c\u0438\u0440\u0430\u0435\u0442 \u043d\u0430 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u043e\u043c\u0430\u0435\u0442 \u043b\u044e\u0431\u0443\u044e \u0431\u0430\u0437\u0443 \u0441 \u0447\u0435\u0441\u0442\u043d\u044b\u043c LRU. \u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c OLTP-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435: 99% \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u044d\u0442\u043e \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0435 \u0442\u043e\u0447\u0435\u0447\u043d\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443, hot working set \u0441\u043f\u043e\u043a\u043e\u0439\u043d\u043e \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u0432 Buffer Pool, hit ratio \u043f\u043e\u0434 99%, p99 latency \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f. \u0418 \u0442\u0443\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0431\u0435\u0437\u043e\u0431\u0438\u0434\u043d\u044b\u0439 SELECT count(*) FROM orders \u0438\u043b\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043e\u0442\u0447\u0451\u0442\u043e\u0432 \u0438\u0437 BI-\u0441\u0438\u0441\u0442\u0435\u043c\u044b.\u0427\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0434\u0430\u043b\u044c\u0448\u0435 \u0441 LRU-\u043a\u044d\u0448\u0435\u043c:\u041f\u043e\u043b\u043d\u044b\u0439 \u0441\u043a\u0430\u043d \u0447\u0438\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439.\u041a\u0430\u0436\u0434\u0430\u044f \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 Buffer Pool.\u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u00ab\u0441\u0432\u0435\u0436\u0430\u044f\u00bb, LRU \u0434\u0435\u0440\u0436\u0438\u0442 \u0435\u0451 \u0441\u0432\u0435\u0440\u0445\u0443 \u0441\u043f\u0438\u0441\u043a\u0430.Hot OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u043e\u0440\u043d\u0438 B-tree-\u0438\u043d\u0434\u0435\u043a\u0441\u043e\u0432) \u0432\u044b\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0438\u0437 \u0438 \u044d\u0432\u0438\u043a\u0442\u044f\u0442\u0441\u044f.\u041f\u043e\u0441\u043b\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f \u0441\u043a\u0430\u043d\u0430 hit ratio \u0440\u0435\u0437\u043a\u043e \u043f\u0430\u0434\u0430\u0435\u0442, \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0438\u0434\u0442\u0438 \u0432 I\/O, p99 \u0443\u0435\u0437\u0436\u0430\u0435\u0442 \u043d\u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a-\u043f\u043e\u043b\u0442\u043e\u0440\u0430 \u0432\u0432\u0435\u0440\u0445.\u042d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c cache pollution. \u0421\u0430\u043c\u043e\u0435 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u043e\u0435 \u0432 \u043d\u0451\u043c \u044d\u0442\u043e \u0430\u0441\u0438\u043c\u043c\u0435\u0442\u0440\u0438\u044f: \u043e\u0434\u0438\u043d \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0441 \u043e\u0434\u043d\u0438\u043c \u00ab\u043d\u0435\u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u00bb \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u0445\u0443\u0434\u0448\u0438\u0442\u044c tail latency \u0434\u043b\u044f \u0432\u0441\u0435\u0433\u043e OLTP-\u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u2014 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0437\u0430\u0439\u043c\u0451\u0442 \u043f\u0440\u043e\u0433\u0440\u0435\u0432 hot working set \u0437\u0430\u043d\u043e\u0432\u043e \u0447\u0435\u0440\u0435\u0437 random reads \u0441 \u0434\u0438\u0441\u043a\u0430.\u041a\u043e\u0440\u0435\u043d\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e LRU \u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0438\u0437 \u043d\u0435\u044f\u0432\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u00ab\u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u043e\u0435 \u0441\u043a\u043e\u0440\u043e \u0441\u043d\u043e\u0432\u0430 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f\u00bb (recency = utility). \u0414\u043b\u044f OLTP \u0441 \u0442\u0438\u043f\u0438\u0447\u043d\u044b\u043c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u041f\u0430\u0440\u0435\u0442\u043e (20% \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442 80% \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439) \u044d\u0442\u043e \u0432 \u0441\u0440\u0435\u0434\u043d\u0435\u043c \u0432\u0435\u0440\u043d\u043e. \u0414\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0430\u043d\u0430 \u044d\u0442\u043e \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u043e\u0432\u043d\u043e \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0443\u0436\u0435 \u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430, \u043c\u044b \u043f\u0440\u043e\u0448\u043b\u0438 \u0435\u0451 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0438 \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435. LRU \u043d\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0435\u0442 \u044d\u0442\u0438 \u0434\u0432\u0430 \u0441\u043b\u0443\u0447\u0430\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u0438 (intent) \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f, \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c \u0444\u0430\u043a\u0442.\u0418\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0442 \u0434\u0432\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0448\u0430\u043b\u0438:\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u044d\u0432\u0438\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0434\u0440\u0443\u0436\u0435\u043b\u044e\u0431\u0435\u043d \u043a \u0432\u044b\u0441\u043e\u043a\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0446\u0438\u0438 (\u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0435 LRU \u043f\u0440\u0438 \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435, \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0438).\u0414\u0430\u0442\u044c \u0441\u043a\u0430\u043d\u0430\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u044d\u0448-\u043c\u0430\u0440\u0448\u0440\u0443\u0442 (cache bypass), \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0438 \u043d\u0435 \u043c\u0435\u0448\u0430\u043b\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0447\u0435\u043c\u0443 \u043d\u0430\u0431\u043e\u0440\u0443.\u041e\u0431\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u0430\u043c\u0438. \u0420\u0430\u0437\u0431\u0435\u0440\u0451\u043c \u0438\u0445 \u043f\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u0438.2. Clock-sweep: \u043a\u0430\u043a \u043c\u044b \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0436\u0435\u0440\u0442\u0432\u0443\u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e Buffer Pool \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 Clock-sweep (\u043e\u043d \u0436\u0435 CLOCK, second-chance). \u042d\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u043a\u0430, \u043e\u0431\u043a\u0430\u0442\u0430\u043d\u043d\u0430\u044f \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u044f\u043c\u0438 \u0432 PostgreSQL \u0438 BSD VM, \u0438 \u043e\u043d\u0430 \u043d\u0430\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:\u0414\u0435\u0448\u0451\u0432\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043f\u043e\u043f\u0430\u0434\u0430\u043d\u0438\u0438 \u0432 \u043a\u044d\u0448. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0431\u0438\u0442 (ref_bit = true). \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u0432\u0435\u0448\u0438\u0432\u0430\u043d\u0438\u0439 \u0443\u0437\u043b\u043e\u0432 \u0432 \u0441\u0432\u044f\u0437\u043d\u043e\u043c \u0441\u043f\u0438\u0441\u043a\u0435, \u043a\u0430\u043a \u0443 honest LRU.\u042d\u0432\u0438\u043a\u0446\u0438\u044f \u0430\u043c\u043e\u0440\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0416\u0435\u0440\u0442\u0432\u0430 \u0438\u0449\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043c\u043e\u043c\u0435\u043d\u0442, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u043c\u0435\u0441\u0442\u043e \u043f\u043e\u0434 \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u0414\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u043f\u043b\u0430\u0442\u0438\u043c \u0437\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435 \u043f\u043e\u0440\u044f\u0434\u043a\u0430.\u0410\u043f\u043f\u0440\u043e\u043a\u0441\u0438\u043c\u0430\u0446\u0438\u044f LRU. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0447\u0430\u0441\u0442\u043e, \u043f\u0435\u0440\u0435\u0436\u0438\u0432\u0430\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0445\u043e\u0434\u043e\u0432 \u00ab\u0441\u0442\u0440\u0435\u043b\u043a\u0438\u00bb \u0438 \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b, \u043a\u0430\u043a \u0433\u043e\u0440\u044f\u0447\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 LRU.\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c BufferPool \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e: \u0441\u043b\u043e\u0432\u0430\u0440\u044c pages: HashMap&lt;PageId, Page&gt;, \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 frames: Vec&lt;PageId&gt; (\u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u00ab\u0446\u0438\u0444\u0435\u0440\u0431\u043b\u0430\u0442\u0430\u00bb) \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0441\u0442\u0440\u0435\u043b\u043a\u0438 clock_hand: usize. \u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0435\u0441\u0442\u044c ref_bit, pin_count \u0438 \u0444\u043b\u0430\u0433 dirty. \u041f\u0441\u0435\u0432\u0434\u043e\u043a\u043e\u0434 \u044d\u0432\u0438\u043a\u0446\u0438\u0438 (\u0441\u043c. \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e):fn evict_for_insert(&amp;mut self, max_cached_pages: usize) {    \/\/ &#8230;    let mut scans_left = self.frames.len().saturating_mul(4).max(1);    while evicted &lt; to_evict &amp;&amp; scans_left &gt; 0 &amp;&amp; !self.frames.is_empty() {        scans_left -= 1;        if self.clock_hand &gt;= self.frames.len() { self.clock_hand = 0; }        let pid = self.frames[self.clock_hand];        let p = self.pages.get_mut(&amp;pid).unwrap();        \/\/ Second chance: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 &#171;\u0433\u043e\u0440\u044f\u0447\u0430\u044f&#187;, \u0441\u043d\u0438\u043c\u0430\u0435\u043c \u0431\u0438\u0442 \u0438 \u0438\u0434\u0451\u043c \u0434\u0430\u043b\u044c\u0448\u0435.        if p.ref_bit {            p.ref_bit = false;            self.clock_hand = (self.clock_hand + 1) % self.frames.len();            continue;        }        \/\/ \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0442\u0435\u0441\u043d\u044f\u0435\u043c pinned\/dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (no-evict-dirty \u043d\u0430 eviction-\u043f\u0443\u0442\u0438).        if p.pin_count != 0 || p.dirty {            self.clock_hand = (self.clock_hand + 1) % self.frames.len();            continue;        }        \/\/ \u042d\u0432\u0438\u043a\u0446\u0438\u044f.        self.pages.remove(&amp;pid);        self.frame_remove(pid);        evicted += 1;    }}\u0427\u0442\u043e \u0437\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438:Bounded scan. \u041b\u0438\u043c\u0438\u0442 frames.len() * 4 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442, \u0447\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043d\u0435 \u0437\u0430\u0446\u0438\u043a\u043b\u0438\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0432\u0441\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0437\u0430\u043d\u044f\u0442\u044b (pinned \u0438\u043b\u0438 dirty). \u0412 \u0445\u0443\u0434\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u043d\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0432 \u0432\u0441\u0435 \u043c\u0435\u0441\u0442\u0430, \u0438 \u0432\u044b\u0448\u0435 \u043f\u043e \u0441\u0442\u0435\u043a\u0443 \u044d\u0442\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u0432 backpressure (\u043e\u0431 \u044d\u0442\u043e\u043c \u043d\u0438\u0436\u0435).No-evict-dirty. dirty \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u0436\u0435\u0440\u0442\u0432\u043e\u0439: \u044d\u0432\u0438\u043a\u0446\u0438\u044f \u0438 flush \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u044b, \u0438 \u043e\u043d\u0438 \u043e\u0440\u0442\u043e\u0433\u043e\u043d\u0430\u043b\u044c\u043d\u044b (\u0441\u043c. \u00a75). \u0412\u0430\u0436\u043d\u043e\u0435 \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u044d\u0442\u043e \u043d\u0435 \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 no-steal \u2014 \u0442\u043e\u0442 \u0437\u0430\u043f\u0440\u0435\u0449\u0430\u0435\u0442 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0434\u0438\u0441\u043a \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043d\u0435\u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0441\u044f \u043a flush-\u043f\u0443\u0442\u0438, \u0430 \u043d\u0435 \u043a eviction-\u043f\u0443\u0442\u0438 (\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0432 \u00a74.2). \u0412 \u043d\u0430\u0448\u0435\u043c MVP \u043e\u0431\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: no-evict-dirty \u043d\u0430 eviction-\u043f\u0443\u0442\u0438 \u0438 no-steal \u043d\u0430 flush-\u043f\u0443\u0442\u0438.Pin count \u043a\u0430\u043a hard barrier. \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u043b\u043e\u0447\u0435\u043d\u0430 \u0434\u043b\u044f \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0442\u0440\u0430\u043d\u0437\u0430\u043a\u0446\u0438\u0438, \u0435\u0451 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0442\u043e\u043b\u043a\u043d\u0443\u0442\u044c \u043d\u0438\u043a\u0430\u043a\u0438\u043c \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u043e\u043c \u044d\u0432\u0438\u043a\u0446\u0438\u0438, \u0442\u043e\u0447\u043a\u0430.2.1. \u041f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e Clock, \u0430 \u043d\u0435 GCLOCK \/ CLOCK-Pro \/ ARC\u0427\u0435\u0441\u0442\u043d\u044b\u0439 \u043e\u0442\u0432\u0435\u0442: \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e MVP-\u0432\u044b\u0431\u043e\u0440 \u0434\u043b\u044f correctness-first \u0444\u0430\u0437\u044b. Clock \u0434\u0430\u0451\u0442 \u0445\u043e\u0440\u043e\u0448\u0443\u044e \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0438 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u043e\u0448\u0438\u0431\u043e\u043a. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0432\u0440\u043e\u0434\u0435 GCLOCK (\u0441 usage_count &gt; 1) \u0438\u043b\u0438 CLOCK-Pro (\u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u0441\u0442\u0440\u0430\u043d\u0438\u0446) \u0434\u0430\u044e\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 hit ratio \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u0430\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043d\u0430\u0434\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u043e\u043c \u0438 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c property-based \u043d\u0430 \u0438\u043d\u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430\u0445.\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u043f\u0433\u0440\u0435\u0439\u0434\u0430 \u0434\u043e GCLOCK \u0438\u043b\u0438 CLOCK-Pro \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435, \u0438 \u043c\u044b \u0432\u0435\u0440\u043d\u0451\u043c\u0441\u044f \u043a \u043d\u0435\u0439, \u043a\u043e\u0433\u0434\u0430 \u0431\u0443\u0434\u0443\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0438 \u0438 trace-\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043e\u043a. \u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e \u044d\u0442\u043e \u0440\u043e\u0432\u043d\u043e \u043e\u0434\u043d\u0430 \u0442\u043e\u0447\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u044f evict_for_insert. \u0414\u043e \u0442\u0435\u0445 \u043f\u043e\u0440 \u043b\u044e\u0431\u043e\u0435 \u0443\u0441\u043b\u043e\u0436\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0431\u044b\u043b\u043e \u0431\u044b premature optimization.\u0421\u0442\u043e\u0438\u0442 \u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f: basic CLOCK \u0445\u043e\u0440\u043e\u0448\u043e \u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u043c OLTP-\u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u041f\u0430\u0440\u0435\u0442\u043e, \u043d\u043e \u043d\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445 \u0441 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u043d\u044b\u043c \u0441\u043a\u043e\u043b\u044c\u0437\u044f\u0449\u0438\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, time-series \u0441 rolling window) CLOCK-Pro \u0434\u0430\u0451\u0442 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u043b\u0443\u0447\u0448\u0438\u0439 hit ratio \u2014 \u0438\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0435 \u043f\u0440\u044f\u043c\u043e \u0441\u0435\u0439\u0447\u0430\u0441\u00bb \u0438 \u00ab\u0433\u043e\u0440\u044f\u0447\u0435\u0435 \u0435\u0449\u0451 \u043d\u0435\u0434\u0430\u0432\u043d\u043e\u00bb. \u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e\u0442 \u0440\u0430\u0437\u0440\u044b\u0432 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u0435\u043d \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u043c\u0435\u0448\u0430\u043d\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u2014 \u043f\u043e\u043a\u0430\u0436\u0443\u0442 trace-\u0434\u0430\u043d\u043d\u044b\u0435.2.2. \u0417\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0435 \u043f\u0440\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0441\u044c BufferPool \u0436\u0438\u0432\u0451\u0442 \u0437\u0430 \u0435\u0434\u0438\u043d\u044b\u043c Mutex \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 StorageEngine. \u042d\u0442\u043e \u0441\u043e\u0437\u043d\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f MVP: \u043b\u0435\u0433\u043a\u043e \u0434\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c, \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u043d\u044f\u0442\u043d\u0430\u044f \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0430. \u041c\u044b \u0437\u043d\u0430\u0435\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u044f\u0434\u0435\u0440 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (sharded buffer pool \u0441 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0439 CLOCK-\u0441\u0442\u0440\u0435\u043b\u043a\u043e\u0439 \u043d\u0430 \u0448\u0430\u0440\u0434, \u043a\u0430\u043a \u0432 InnoDB), \u0438 \u044d\u0442\u043e \u044f\u0432\u043d\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0434\u0438\u0437\u0430\u0439\u043d-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433. \u041d\u043e \u0448\u0430\u0440\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u2014 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u043c\u0438 \u043a\u0430\u043c\u043d\u044f\u043c\u0438 (\u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0448\u0430\u0440\u0434\u0430\u043c\u0438, \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0434\u0440\u043e\u043f-\u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438, \u043c\u0435\u0442\u0440\u0438\u043a\u0438 per-shard), \u0438 \u0435\u0451 \u043c\u044b \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437. \u041f\u043e\u043a\u0430 \u043c\u044b \u043d\u0435 \u0443\u043f\u0451\u0440\u043b\u0438\u0441\u044c \u0432 Mutex \u043d\u0430 \u0431\u0435\u043d\u0447\u043c\u0430\u0440\u043a\u0430\u0445, \u043c\u044b \u043d\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c.\u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u043f\u043e\u0440\u043e\u0433, \u043f\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u043c mutex \u043d\u0430 Buffer Pool \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0438\u0434\u0438\u043c\u044b\u043c \u0443\u0437\u043a\u0438\u043c \u043c\u0435\u0441\u0442\u043e\u043c, \u0441\u0438\u043b\u044c\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0441\u043e\u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u044f read\/write, \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0438 scheduler affinity \u2014 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u044d\u0442\u0430 \u0442\u043e\u0447\u043a\u0430 \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0433\u0434\u0435-\u0442\u043e \u043c\u0435\u0436\u0434\u0443 8 \u0438 32+ \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u044f\u043c\u0438, \u0438 \u043e\u043d\u0430 \u043d\u0435\u043b\u0438\u043d\u0435\u0439\u043d\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u0430 dirty-\u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0432 \u043f\u0443\u043b\u0435.3. BufferRing: cache bypass \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u043e\u0432Clock-sweep \u0441\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u043d\u0435 \u0440\u0435\u0448\u0430\u0435\u0442 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 cache pollution. \u041e\u043d \u043b\u0438\u0448\u044c \u0434\u0435\u043b\u0430\u0435\u0442 \u0432\u044b\u0431\u043e\u0440 \u0436\u0435\u0440\u0442\u0432\u044b \u0434\u0435\u0448\u0435\u0432\u043b\u0435, \u0447\u0435\u043c \u0443 LRU. \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d \u043d\u0430\u0442\u0430\u0449\u0438\u0442 \u0432 \u043f\u0443\u043b \u0442\u044b\u0441\u044f\u0447\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u0441 ref_bit = true, \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u043d\u0443 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0441\u0442\u0440\u0435\u043b\u043a\u0438 \u043e\u043d\u0438 \u0441\u0442\u0430\u043d\u0443\u0442 \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430\u043c\u0438 \u043d\u0430 \u044d\u0432\u0438\u043a\u0446\u0438\u044e, \u0438 \u0432 \u044d\u0442\u0443 \u0436\u0435 \u044d\u0432\u0438\u043a\u0446\u0438\u044e \u043f\u043e\u043f\u0430\u0434\u0443\u0442 \u0445\u043e\u0442-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0443 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 ref_bit \u0442\u043e\u0436\u0435 \u0443\u0441\u043f\u0435\u043b \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f\u043c\u0438.\u0427\u0442\u043e\u0431\u044b \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u043a\u0430\u043d\u044b \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043f\u0443\u043b\u0430, \u043c\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443, BufferRing. \u042d\u0442\u043e \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043b\u044c\u0446\u0435\u0432\u043e\u0439 \u0431\u0443\u0444\u0435\u0440 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 32 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d [4, 256]), \u043a\u0443\u0434\u0430 \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438 \u0441\u043a\u0430\u043d\u0430\u0445 \u0441 \u044f\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 BufferAccessStrategy::BulkRead. \u0420\u0430\u0437\u0432\u0438\u043b\u043a\u0430 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:BufferAccessStrategy    \u2502    \u251c\u2500 Normal   \u2500\u2500\u25b6  BufferPool   CLOCK-sweep \u00b7 pin \/ unpin \u00b7 no-steal    \u2502                    \u2502    \u2514\u2500 BulkRead \u2500\u2500\u25b6  BufferRing   32 \u0441\u043b\u043e\u0442\u0430 FIFO \u00b7 read-only \u00b7 \u0441\u0432\u043e\u0439 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043a\u0430\u043d                         \u2502                   \u0414\u0438\u0441\u043a\u043e\u0432\u044b\u0439 I\/OHot OLTP-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043f\u0443\u043b\u0435 \u0438 \u043d\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u044e\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e \u0438\u0434\u0451\u0442 full table scan. \u0421\u043a\u0430\u043d\u044b \u043a\u0440\u0443\u0442\u044f\u0442\u0441\u044f \u0432 \u0441\u0432\u043e\u0451\u043c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u043e\u043c \u043a\u043e\u043b\u044c\u0446\u0435 \u0438 \u044d\u0432\u0438\u043a\u0442\u044f\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0440\u0443\u0433 \u0434\u0440\u0443\u0433\u0430.pub enum BufferAccessStrategy {    \/\/\/ \u041e\u0431\u044b\u0447\u043d\u044b\u0439 OLTP-\u0434\u043e\u0441\u0442\u0443\u043f: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 BufferPool.    Normal,    \/\/\/ Bulk read: \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438\u0434\u0443\u0442 \u0447\u0435\u0440\u0435\u0437 BufferRing,    \/\/\/ \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0443\u043b \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0435\u043c.    BulkRead,    \/\/\/ Bulk write (\u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043f\u043e\u0434 \u0431\u0443\u0434\u0443\u0449\u0438\u0435 COPY\/INSERT batch)&#8230;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-478415","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478415","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=478415"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/478415\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=478415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=478415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=478415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}