Changes between Initial Version and Version 1 of DBA_shared_buffers


Ignore:
Timestamp:
06/08/25 11:52:55 (6 days ago)
Author:
216049
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DBA_shared_buffers

    v1 v1  
     1= Кеширање на податоци
     2
     3Shared_buffers е конфигурациски параметар во PostgreSQL кој одредува колкава меморија ќе биде алоцирана за кеширање на податоци од базата. Оваа меморија се споделува меѓу сите PostgreSQL процеси и се користи за да се зачуваат често пристапувани страници од дискот директно во RAM меморијата. Целта е да се намали бројот на бавни дискови операции со тоа што податоците ќе бидат достапни директно од меморијата, што значително ги подобрува перформансите на базата. Кога корисникот бара податоци, PostgreSQL прво проверува дали тие се наоѓаат во shared_buffers, и само ако не се тука ќе чита од дискот. Правилното подесување на оваа вредност е критично за оптимални перформанси. Премногу мала вредност значи повеќе дискови операции, додека премногу голема може да предизвика проблеми со меморијата на системот.
     4
     5== Конфигурирање на shared_buffers
     6
     7Конфигурирањето на shared_buffers се прави преку менување на postgresql.conf датотеката каде што се наоѓа параметарот shared_buffers (најчесто би требало да се наоѓа во /etc/postgresql/{version}/main/postgresql.conf). Општо препорачување е да се постави на околу 25% од вкупната RAM меморија на серверот, но не повеќе од 8GB за повеќето системи бидејќи PostgreSQL користи и оперативниот систем за кеширање. На пример, ако имате 16GB RAM, можете да поставите shared_buffers = 4GB или shared_buffers = 4096MB. По промената на оваа вредност, потребно е да го рестартирате PostgreSQL серверот за промените да стапат на сила, бидејќи ова е параметар кој не може да се менува динамички. За помали системи со помалку од 1GB RAM, препорачува се да започнете со 128MB и постепено да ја зголемувате вредноста додека не забележите подобрување во перформансите. Важно е да се тестираат перформансите по секоја промена и да се следат системските ресурси за да се избегне преоптоварување на меморијата.
     8
     9== Дијагностика
     10
     11* Shared buffers usage and hit ratio for individual queries:
     12{{{#!div
     13{{{#!sql
     14SELECT query,
     15    shared_blks_hit + shared_blks_read AS total_shared_blocks_accessed,
     16    shared_blks_hit AS shared_hit,
     17    shared_blks_read AS shared_read,
     18    (shared_blks_hit::float / NULLIF(shared_blks_hit + shared_blks_read, 0)) * 100 AS hit_ratio,
     19    calls
     20FROM pg_stat_statements
     21ORDER BY total_shared_blocks_accessed DESC
     22LIMIT 20;
     23}}}
     24}}}
     25
     26* Shared buffers usage and hit ratio for indexes:
     27{{{#!div
     28{{{#!sql
     29SELECT schemaname,
     30    relname AS table_name,
     31    indexrelname AS index_name,
     32    idx_blks_read,
     33    idx_blks_hit,
     34    CASE WHEN (idx_blks_hit + idx_blks_read) > 0
     35             THEN idx_blks_hit::float / (idx_blks_hit + idx_blks_read)
     36         ELSE NULL
     37        END AS idx_hit_ratio
     38FROM pg_statio_user_indexes
     39WHERE (idx_blks_hit + idx_blks_read) > 10000 -- Only include indexes with substantial activity
     40        AND idx_blks_read > 1000 -- Ensure there are enough reads to make the ratio meaningful
     41        and schemaname != 'ingestion'
     42ORDER BY idx_hit_ratio ASC, -- Worst ratios first
     43    idx_blks_read DESC -- For equal ratios, prioritize indexes with more disk reads
     44LIMIT 200;
     45}}}
     46}}}
     47
     48* Shared buffers hit ratio total (bez sum za individualno po tabela) - aim for 95-99%
     49{{{#!div
     50{{{#!sql
     51SELECT sum(heap_blks_read) as heap_read,
     52    sum(heap_blks_hit) as heap_hit,
     53    sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)) as ratio
     54FROM pg_statio_user_tables;
     55}}}
     56}}}
     57
     58* Кои табели и индекси се кеширани во shared_buffers и колку зафаќаат
     59{{{#!div
     60{{{#!sql
     61CREATE EXTENSION IF NOT EXISTS pg_buffercache;
     62--by tables/indexes
     63SELECT c.relname AS relation,
     64    c.relkind AS type,
     65    count(*) AS buffers,
     66    round(count(*) * 8192.0 / (1024 * 1024), 2) AS size_mb
     67FROM pg_buffercache b
     68         JOIN pg_class c ON b.relfilenode = pg_relation_filenode(c.oid)
     69         JOIN pg_database d ON b.reldatabase = d.oid
     70WHERE d.datname = current_database()
     71GROUP BY c.relname, c.relkind
     72ORDER BY buffers DESC;
     73}}}
     74}}}
     75
     76== Тест