Кеш страниц и грязные данные: dirty pages, fsync, drop_caches

Рейтинг: 56.5% · 9 голосов
Подробный курс по диагностике и производительности Linux для админов и DevOps: с чего начать, методология USE, логи (journalctl, dmesg), процессы, CPU, память и OOM, диск и IO (iostat), сеть (ss, tcpdump), системные вызовы и strace, ltrace, perf, флеймграфы, ftrace, eBPF и bpftrace, lsof, мониторинг. Разбор каждого инструмента с чтением вывода.
Ответить
Аватара пользователя
Dmitry_SRE
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Кеш страниц и грязные данные: dirty pages, fsync, drop_caches

Сообщение Dmitry_SRE »

Оглавление курса (47)
  1. С чего начать диагностику Linux: методология вместо паники
  2. Первые 60 секунд: экспресс-диагностика нагруженного сервера
  3. Методологии диагностики: USE, RED и здравый смысл
  4. Логи systemd через journalctl: где искать причину
  5. Где лежат логи Linux: /var/log, dmesg и rsyslog
  6. Источники правды: load average, /proc и /sys
  7. Процессы Linux: ps, pstree и состояния процессов
  8. Интерактивный мониторинг: top и htop
  9. Метрики процессов во времени: pidstat
  10. Приоритеты и ограничения: nice, ionice, cgroups
  11. Сигналы и зависшие процессы: kill, и что делать с D-state
  12. Загрузка CPU: user, system, iowait, steal и контекст-свитчи
  13. Диагностика CPU по ядрам: vmstat и mpstat
  14. Профилирование CPU: perf top и поиск пожирателя
  15. Частоты, троттлинг и NUMA: turbostat и numastat
  16. Память Linux: RSS, VSZ, page cache и миф о нехватке памяти
  17. Сколько памяти занято: free, /proc/meminfo и vmstat
  18. Поиск утечек и пожирателей памяти: smem, pmap, smaps
  19. Swap и подкачка: swapon, swappiness, когда своп - это боль
  20. OOM killer: кто и за что убил процесс
  21. Память ядра и slab: slabtop и куда уходит RAM
  22. Подсистема ввода-вывода: путь запроса от приложения до диска
  23. Диагностика диска: iostat и чтение await, %util
  24. Кто грузит диск: iotop и атрибуция io процессам
  25. Файловые системы: df, du, иноды и куда делось место
  26. Глубокая диагностика блочного слоя: blktrace и biolatency
  27. Кеш страниц и грязные данные: dirty pages, fsync, drop_caches (вы здесь)
  28. Сетевой стек Linux: путь пакета и где возникают задержки
  29. Сокеты и соединения: ss и netstat
  30. Захват трафика: tcpdump для диагностики сети
  31. Задержки и потери в сети: ping, mtr, диагностика латентности
  32. Сеть как источник проблем: nftables, conntrack, дропы
  33. Что такое системный вызов и зачем его трассировать
  34. strace: трассировка системных вызовов на практике
  35. strace в бою: почему программа висит, падает или тормозит
  36. ltrace: трассировка вызовов библиотек
  37. Накладные расходы трассировки и безопасные альтернативы
  38. perf: универсальный профайлер Linux
  39. Флеймграфы: визуализация профиля производительности
  40. Трассировка ядра: ftrace и trace-cmd
  41. eBPF: революция в наблюдаемости Linux
  42. Инструменты eBPF на практике: BCC и bpftrace
  43. lsof: открытые файлы, дескрипторы, кто держит файл и порт
  44. Разбор кейса: приложение тормозит - пошаговая диагностика
  45. Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix
  46. Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes
  47. Карта инструментов и сквозной разбор инцидента производительности
Знакомая боль: запускаешь команду чтения большого файла, и первый раз она ползёт секунды, а второй раз отрабатывает мгновенно. Или наоборот: база данных стабильно отвечает за 2 мс, и вдруг раз в минуту прилетает пик в 300 мс, причём диск вроде не загружен. Сидишь, смотришь на графики и не понимаешь, кто врёт. Так вот, виноват чаще всего не диск и не сеть, а буферизация ввода-вывода. Между твоим приложением и реальным железом стоит page cache linux - кеш страниц, и пока ты не понимаешь, как он работает, любые замеры производительности io будут давать случайные числа.

В этом уроке разберём, почему io в Linux непредсказуем, что такое грязные страницы (dirty pages linux), кто и когда их сбрасывает на диск, откуда берутся всплески задержек и при чём тут fsync в базах данных. Научимся это руками смотреть и мерить честно, причём не только классикой (strace, /proc/meminfo), но и современным стеком eBPF, который к 2026 году стал стандартом для такой диагностики.

Как устроен кеш страниц linux: чтение, запись и грязные страницы

Ядро Linux старается не дёргать диск лишний раз. Все обычные файлы оно держит в оперативной памяти в виде кеша - это и есть page cache. Память разбита на страницы по 4 КБ, и каждая прочитанная с диска страница файла остаётся в RAM, пока память не понадобится под что-то другое. В выводе free этот кеш отражается в колонке buff/cache.

С чтением просто. Первый раз страница не в кеше - ядро идёт на диск, это медленно. Дальше та же страница уже в RAM, и повторное чтение идёт из памяти. Вот почему вторая команда быстрее первой: данные просто не дошли до диска повторно. Это не магия и не "прогрелся процессор", это кеш страниц linux.

С записью хитрее, и тут зарыт корень всех проблем. Когда программа пишет в файл обычным write(), данные сначала ложатся в страницу в памяти, и эта страница помечается как грязная (dirty). Программе сразу говорят "записано", хотя на диске ещё ничего нет. Реальная запись на диск называется writeback и происходит позже, в фоне. Аналогия: ты сложил письма в почтовый ящик у подъезда (быстро, ящик - это память), а почтальон отвезёт их на почту (диск) когда-нибудь потом по расписанию. Пока письма в ящике, формально они "отправлены", но реально лежат рядом с тобой.

Грязные данные - это удобно (запись быстрая) и опасно (при потере питания ящик сгорит вместе с письмами). Поэтому весь вопрос производительности и надёжности io крутится вокруг того, когда и как dirty pages linux уезжают на диск.

Посмотреть текущее состояние можно прямо в /proc/meminfo:

Код: Выделить всё

$ grep -E 'Cached|Dirty|Writeback' /proc/meminfo
Cached:          5242880 kB
Dirty:             10240 kB
Writeback:             0 kB
WritebackTmp:          0 kB
Читаем по полям:
  • Cached - общий размер кеша страниц. Обычно это большая часть RAM, и это нормально (см. раздел про грабли).
  • Dirty - сколько килобайт грязных страниц ждут сброса на диск. Норма для тихой системы - единицы-десятки МБ. Если тут стабильно сотни МБ или гигабайты - значит, в систему льют запись быстрее, чем диск успевает её принимать. Это первый признак, что грядут пики.
  • Writeback - сколько прямо сейчас активно пишется на диск. Если поле постоянно ненулевое и большое - диск работает на пределе, идёт массовый сброс.
Удобно смотреть в динамике:

Код: Выделить всё

watch -n1 "grep -E 'Dirty|Writeback' /proc/meminfo"
- и параллельно создавать нагрузку. Увидишь, как Dirty растёт при записи и опадает, когда ядро запускает writeback.

Изображение

vm dirty ratio: когда ядро начинает сбрасывать и откуда всплески latency

Сколько грязных страниц ядро терпит до сброса, задают два параметра. Это ключ к пониманию пиков задержки, поэтому разберём подробно.

Код: Выделить всё

$ sysctl vm.dirty_background_ratio vm.dirty_ratio
vm.dirty_background_ratio = 10
vm.dirty_ratio = 20
Оба - проценты от объёма доступной для грязных страниц памяти. Исторический дефолт dirty_ratio был 40, но начиная с ядер примерно 3.x и на современных дистрибутивах (RHEL/Alma, Debian/Ubuntu, Astra, RED OS - ядро generic) чаще видишь 20, а в контейнерах и облаках значения могут быть и ниже. Точное значение всегда смотри через sysctl, не верь дефолтам из старых статей.
  • vm.dirty_background_ratio (мягкий порог). Когда доля грязных страниц переваливает за этот процент, в фоне просыпаются потоки writeback. В ps/top их видно как kworker (на современных ядрах это per-bdi flusher-потоки вида kworker/u*; старое имя pdflush ушло ещё в 2.6.32). Они тихо сбрасывают данные на диск, приложения при этом ничего не замечают - запись по-прежнему быстрая.
  • vm.dirty_ratio (жёсткий порог). Если грязных страниц накопилось столько, что они перешагнули этот процент, ядро говорит "хватит" и начинает тормозить (throttle) сами процессы записи: твой write() блокируется и ждёт, пока часть данных не уедет на диск. Вот он, источник всплеска latency. Приложение, которое только что писало за микросекунды, внезапно зависает на сотни миллисекунд.
Картина пика такая: запись копилась в памяти, пока всё было хорошо и быстро, накопилось до vm dirty ratio, и тут ядро резко начало синхронно выгружать гору данных на диск, заблокировав всех писателей. На графике это выглядит как ровная линия с регулярными зубцами вверх. Чем больше памяти и чем выше dirty_ratio, тем реже, но тем больнее пики - за раз сбрасывается больше. На сервере со 128 ГБ RAM dirty_ratio=20 разрешает накопить десятки гигабайт грязных страниц, и когда они разом полетят на диск, latency встанет колом.

Есть ещё два таймера, они тоже влияют:

Код: Выделить всё

$ sysctl vm.dirty_expire_centisecs vm.dirty_writeback_centisecs
vm.dirty_expire_centisecs = 3000
vm.dirty_writeback_centisecs = 500
Значения в сотых долях секунды. dirty_expire_centisecs = 3000 значит, что страница, провисевшая грязной дольше 30 секунд, считается "просроченной" и подлежит сбросу независимо от процентов. dirty_writeback_centisecs = 500 - раз в 5 секунд просыпается flusher и проверяет, не пора ли что-то сбросить.

Отдельно про 2026: на современных дистрибутивах по умолчанию работает cgroup v2, и в нём writeback стал cgroup-aware. Это значит, что лимит грязных страниц и троттлинг считаются с учётом memory-контроллера конкретного cgroup (через memory.high и io-контроллер). На практике: один шумный контейнер, заливающий диск записью, уже не так легко тормозит весь хост, как было на cgroup v1. Но глобальные vm.dirty_* по-прежнему действуют как верхняя граница.

Практический вывод: если видишь периодические пики записи, не вини сразу диск. Сначала глянь Dirty в /proc/meminfo в момент пика и текущие dirty_ratio. Снижение dirty_background_ratio (например, до 5) и dirty_ratio (до 10) делает сбросы чаще, но мельче - пики становятся ниже и ровнее. Альтернатива при огромной RAM - перейти на абсолютные байтовые лимиты vm.dirty_bytes/vm.dirty_background_bytes (они переопределяют проценты), например 256 МБ фон и 1 ГБ жёсткий, чтобы порог не зависел от объёма памяти. Это классическая правка для серверов БД и нагруженного storage. Менять так:

Код: Выделить всё

sudo sysctl -w vm.dirty_background_ratio=5
(для постоянства - файл в /etc/sysctl.d/).

fsync linux: почему база данных сама создаёт себе задержки

Теперь самое интересное место, где сходятся производительность и надёжность. Грязные страницы - это риск потерять данные при сбое. Базам данных это недопустимо: если СУБД сказала клиенту "транзакция зафиксирована", данные обязаны пережить выдёргивание шнура. Поэтому БД не доверяют фоновому writeback. Они сами вызывают системный вызов fsync (или его младшего брата fdatasync), который говорит ядру: "брось всё, протолкни вот эти грязные страницы конкретного файла на диск прямо сейчас и не возвращай мне управление, пока диск не подтвердит запись".
  • fsync - синхронизирует и данные файла, и его метаданные (размер, время изменения).
  • fdatasync - синхронизирует данные и только критичные для целостности метаданные (например, размер файла, если он вырос). Не трогает несущественные вроде времени модификации, поэтому чуть быстрее - часто меньше операций над журналом ФС. БД нередко используют именно его.
И вот парадокс: fsync linux - честный, но медленный. Он ждёт физического подтверждения от диска. На обычном SSD это сотни микросекунд - единицы миллисекунд, на сетевом диске (EBS, Ceph RBD) или перегруженном хранилище - десятки и сотни. Postgres делает fsync/fdatasync на запись WAL при коммите (поведение задаётся wal_sync_method и fsync=on, который трогать нельзя), MySQL/InnoDB - через innodb_flush_log_at_trx_commit=1. Поэтому когда жалуются "база тормозит на коммитах, а диск не загружен по iostat" - почти всегда упёрлись в латентность fsync, а не в пропускную способность диска. Особенно коварны диски с volatile write cache без honest flush: они врут о завершении записи, и единственный, кто заставляет их быть честными - это fsync.

Классический способ поймать fsync руками - strace, посчитаем, сколько времени процесс реально проводит в этом вызове:

Код: Выделить всё

$ sudo strace -f -e trace=fsync,fdatasync -T -p <PID БД> 2>&1 | head
[pid 2412] fdatasync(42) = 0 <0.008931>
[pid 2412] fdatasync(42) = 0 <0.011207>
[pid 2412] fdatasync(42) = 0 <0.009644>
Число в угловых скобках (флаг -T) - длительность вызова в секундах. Здесь fdatasync на дескриптор 42 (файл WAL) занимает 8-11 мс. Если на коммит приходится такой fdatasync, вот он, потолок по скорости транзакций - примерно 100 коммитов в секунду на один поток. Норма для NVMe - доли миллисекунды; если видишь 10+ мс стабильно - проблема в дисковой подсистеме, а не в БД.

Важно на 2026: strace тормозит трассируемый процесс в разы (каждый syscall перехватывается через ptrace со сменой контекста). На проде так замерять боевую БД - значит уронить ей производительность. Современный путь - eBPF, который трассирует в ядре почти без накладных расходов.

Современная диагностика на eBPF: syncsnoop, ext4slower, biolatency

К 2026 году экосистема eBPF (bcc-tools и bpftrace) - зрелая и стоит почти везде, где ядро 5.x+ (а это весь свежий Linux). Для задержек io она уже фактически заменила strace и многие сценарии perf. Ставится пакетом bpfcc-tools (Debian/Ubuntu/Astra) или bcc-tools (RHEL/Alma/RED OS); bpftrace - отдельным пакетом.

syncsnoop - ловит все вызовы семейства sync (sync, fsync, fdatasync, msync) по системе, не привязываясь к PID. Идеально, чтобы понять "кто и как часто синкает":

Код: Выделить всё

$ sudo syncsnoop-bpfcc
TIME      PID    COMM             EVENT
03:12:41  2412   postgres         tracepoint:syscalls:sys_enter_fdatasync
03:12:41  2412   postgres         tracepoint:syscalls:sys_enter_fdatasync
ext4slower (есть аналоги xfsslower, btrfsslower) - показывает только операции медленнее порога, времена меряются в ядре. Тип S в колонке T - это и есть fsync:

Код: Выделить всё

$ sudo ext4slower-bpfcc 5
TIME     COMM        PID    T BYTES  OFF_KB  LAT(ms) FILENAME
03:20:11 postgres    2412   S 0      0         11.84 0000000A.wal
03:20:12 postgres    2412   S 0      0          9.55 0000000A.wal
Колонки: T - тип (R чтение, W запись, O открытие, S sync), LAT(ms) - задержка операции в миллисекундах от выдачи через VFS до завершения, FILENAME - какой файл. Здесь сразу видно: тормозит именно sync на WAL, 9-12 мс. Аргумент 5 - порог в мс, печатать только то, что дольше.

biolatency - гистограмма задержек на уровне блочного устройства. Отвечает на вопрос "а сам диск-то быстрый?":

Код: Выделить всё

$ sudo biolatency-bpfcc
     usecs        : count     distribution
       64 -> 127  : 1820    |****************    |
      128 -> 255  : 3940    |********************|
      256 -> 511  : 410     |****                |
     1024 -> 2047 : 12      |                    |
Если основная масса в десятках-сотнях микросекунд, диск здоров, и виновата латентность fsync/throttling выше по стеку. Если у диска самого хвост в единицы-десятки миллисекунд - проблема в железе или storage. Связка простая: ext4slower/syncsnoop показывает, что приложение упёрлось в sync, а biolatency говорит, виноват ли в этом диск или сам механизм синхронизации.

Просмотр и прогрев кеша: vmtouch, pcstat и честный замер через drop_caches

Раз кеш так влияет на скорость, надо уметь видеть, что в нём лежит. Голыми средствами это не показать, нужны vmtouch или pcstat (ставятся отдельно; vmtouch есть в репозиториях многих дистрибутивов, pcstat - бинарь с GitHub, оба используют системный вызов mincore).

Код: Выделить всё

$ vmtouch /var/lib/pgsql/data/base/16384/2619
           Files: 1
     Directories: 0
  Resident Pages: 384/2048  1536K/8192K  18.75%
         Elapsed: 0.000812 seconds
Читаем вывод vmtouch:
  • Resident Pages: 384/2048 - из 2048 страниц файла прямо сейчас в памяти (резидентны) 384. То есть в кеше лежит лишь часть файла.
  • 1536K/8192K 18.75% - те же 384 страницы в килобайтах и доля файла в кеше. 18.75% значит, что при следующем полном чтении 81% данных поедет с диска.
Это ответ на "почему запрос то быстрый, то медленный": если рабочие данные горячие (близко к 100% в кеше) - быстро, если их вытеснили - медленно. vmtouch умеет и прогревать кеш принудительно:

Код: Выделить всё

vmtouch -t /path/to/file
загрузит файл в память (touch), а

Код: Выделить всё

vmtouch -e /path/to/file
выгрузит (evict). Прогрев полезен после рестарта сервиса, чтобы первые запросы не били по холодному диску. pcstat удобен для нескольких файлов сразу:

Код: Выделить всё

pcstat /var/lib/pgsql/data/base/16384/*
выдаст таблицу с процентом кеша по каждому.

Теперь про честный замер. Если бенчмаркаешь чтение, а данные уже в кеше, ты меришь скорость памяти, а не диска - и получаешь красивые, но бессмысленные гигабайты в секунду. Чтобы померить именно холодное чтение, кеш надо сбросить через drop_caches. Важнейший нюанс: сначала sync, потом drop. drop_caches не трогает грязные страницы, он чистит только уже синхронизированный кеш, поэтому без sync ты рискуешь намерить ерунду (грязные страницы остались бы в памяти и читались бы из неё):

Код: Выделить всё

$ sync
$ echo 3 | sudo tee /proc/sys/vm/drop_caches
3
Значения для drop_caches:
  • 1 - сбросить только кеш страниц (page cache);
  • 2 - сбросить кеш inode и dentry (метаданные файловой системы);
  • 3 - сбросить и то, и другое.
После этого читаем файл и видим честное холодное время. Прогнали второй раз - получили скорость из кеша. Разница между ними и есть цена обращения к диску.

Предупреждение: drop_caches - инструмент для лаборатории и разовой диагностики, не для прода в кроне. Сбросив кеш на боевом сервере, ты заставишь все сервисы заново читать данные с диска и получишь искусственную просадку производительности на ровном месте.

Типичные грабли и заблуждения
  • "Память почти вся занята, надо срочно чистить." Нет. Кеш страниц специально занимает всю свободную память - это правильно и полезно. В выводе free смотри на колонку available, а не на used: ядро отдаст кеш под приложения мгновенно, как только понадобится. Заполненный кешем RAM - здоровая система, а не утечка.
  • "Сделал write(), значит данные на диске." Нет, данные в грязной странице в памяти. На диск их гарантированно проталкивает только fsync/fdatasync. Выдернешь питание между write и fsync - потеряешь.
  • Замер без сброса кеша. Меришь скорость диска, а на деле читаешь из RAM. Всегда sync, потом drop_caches перед холодным бенчмарком.
  • drop_caches как "лекарство" от высокого потребления памяти в кроне. Лечишь несуществующую болезнь и портишь производительность. Кеш не утечка.
  • Виню диск во всех пиках записи. Сначала Dirty в /proc/meminfo и vm dirty ratio - часто пики создаёт сам механизм writeback при больших порогах, а не железо. Проверь это через biolatency.
  • Замеряю боевую БД через strace. strace кратно замедляет процесс. На проде бери eBPF (syncsnoop, ext4slower) - почти без накладных расходов.
Мини-лаба: повтори руками прямо сейчас
  • Создай файл и понаблюдай за грязными страницами: в одном окне

    Код: Выделить всё

    watch -n1 "grep -E 'Dirty|Writeback' /proc/meminfo"
    , в другом

    Код: Выделить всё

    dd if=/dev/zero of=/tmp/bigfile bs=1M count=2048 oflag=direct,nonblock 2>/dev/null; dd if=/dev/zero of=/tmp/bigfile bs=1M count=2048
    . Смотри, как Dirty подскакивает на втором dd, а затем опадает после writeback.
  • Замерь холодное и горячее чтение:

    Код: Выделить всё

    sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
    , затем

    Код: Выделить всё

    dd if=/tmp/bigfile of=/dev/null bs=1M
    (запомни скорость), и сразу повтори dd ещё раз. Сравни цифры - вторая будет в разы быстрее, это кеш.
  • Поставь vmtouch (или pcstat) и посмотри, сколько процентов /tmp/bigfile сидит в кеше после прогрева, затем выгрузи через

    Код: Выделить всё

    vmtouch -e /tmp/bigfile
    и проверь снова.
  • Если есть тестовая БД - запусти в одном окне

    Код: Выделить всё

    sudo syncsnoop-bpfcc
    , в другом погоняй коммиты, посмотри частоту fdatasync. Затем

    Код: Выделить всё

    sudo ext4slower-bpfcc 1
    и сравни задержки sync с гистограммой

    Код: Выделить всё

    sudo biolatency-bpfcc
    .
Контрольные вопросы
  • Чем отличается путь записи от пути чтения в page cache и в какой момент данные реально оказываются на диске?
  • Что произойдёт с приложением, когда доля грязных страниц перешагнёт vm.dirty_ratio, и почему это видно как всплеск latency?
  • Зачем база данных вызывает fsync/fdatasync, если фоновый writeback и так сбросит данные, и почему этот вызов медленный?
  • Почему перед echo 3 в drop_caches обязательно делать sync, и в каких полях /proc/meminfo это отражается?
Что запомнить

Кеш страниц делает чтение быстрым (повторное - из памяти), а запись отложенной (через грязные страницы и writeback) - отсюда вся непредсказуемость io. Грязные страницы и пороги vm.dirty_background_ratio/vm.dirty_ratio объясняют регулярные пики задержки записи: смотри Dirty и Writeback в /proc/meminfo, при огромной RAM думай про dirty_bytes. fsync/fdatasync - честный, но медленный способ дотащить данные до диска, главный источник задержек коммитов в БД. Ловить его в 2026 лучше через eBPF (syncsnoop, ext4slower, biolatency), а не strace, который кратно тормозит процесс. Для честного замера скорости диска всегда делай sync и drop_caches, но никогда не по расписанию в проде. Занятый кешем RAM - норма: ориентируйся на available, а не на used.
👍2 ❤️2 🔥 😄 🤔
Аватара пользователя
offence
Сообщения: 1
Зарегистрирован: 21 май 2026, 11:25

Re: Кеш страниц и грязные данные: dirty pages, fsync, drop_caches

Сообщение offence »

Вот это прям щелкнуло про vmtouch. У нас постгрес после рестарта первые минуты тупил, а я грешил на сеть. Прогрел файлы базы через vmtouch -t и первые запросы перестали бить по холодному диску. Спасибо!
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
kkfkas
Сообщения: 1
Зарегистрирован: 11 май 2026, 12:32

Re: Кеш страниц и грязные данные: dirty pages, fsync, drop_caches

Сообщение kkfkas »

Снёс strace с прода после этого урока. syncsnoop и ext4slower показали ровно то же по fdatasync, но без просадки базы. biolatency сразу подтвердил, что диск чистый, а упёрлись мы в сам fsync. Топ.
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Глубокая диагностика блочного слоя: blktrace и biolatency
Следующая глава →
Сетевой стек Linux: путь пакета и где возникают задержки

Все главы курса «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Поделиться темой: ✈ Telegram VK

Вернуться в «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость