|
Wednesday, 5 September. 2007Solaris: углубленный мониторинг сервера базы данных
Это часть перевода доступной c sun.com в pdf главы про углубленный мониторинг серверов баз данных из книги "Configuring and Tuning Databases on the Solaris Platform" Алана Пэкера. Материал немного устарел - речь идет о Solaris 8 и 9, но все равно будет полезен тем, кто администрирует сервера баз данных.
Итак, время пришло. Взяв на вооружение лишь собственный разум, добавив к нему немного здравого смысла и некоторые основные знания системы, вы собираетесь решить проблему производительности, от которой страдает сервер базы данных. Засучите рукава и устройтесь удобнее за клавиатурой. Группа слегка напуганных коллег широко раскрыв глаза наблюдает из-за вашего плеча. С чего же следует начать? Вашему вниманию предлагается пятиэтапный процесс, который позволит последовательно проанализировать основные компоненты системы -память, дисковую подсистему ввода-ввывода, сеть и центральный процессор - после чего заняться мониторингом и настройкой базы данных. Если проблема обнаружится в одной из этих областей, могут быть предприняты дальнейшие шаги для ее локализации. Эта разновидность подхода к проведению углубленного анализа представляет собой эффективный способ выявления и в конечном итоге разрешения имеющихся проблем производительности. Если обнаруживается какое-либо "узкое место" (под которым в данном случае подразумевается ограничение производительности точно так же, как горлышко бутылки ограничивает течение жидкости в бутылку и из нее), то означает ли это, что все исследования на этом заканчиваются? Целесообразно в любом случае пройти весь процесс до конца, чтобы увидеть все возможные критичные показатели и проблемы производительности.
Однако следует иметь в виду, устранение одного "узкого места" может привести к выявлению других узких мест. Предположим, например, что система интенсивно ведет замещение страниц из-за нехватки памяти, но при этом никаких других проблем установить не удалось. Добавление памяти могло бы позволить улучшить производительность до отметки, на которой использование одного из дисков становится чрезмерным, в результате чего узким местом становится уже дисковая подсистема. Исследование дисковой подсистемы также могло бы обнаружить новые проблемы производительности. Как только вы обнаружили и устранили "узкое место", повторите предлагаемый процесс исследования еще раз. Наконец, является ли важным предлагаемый порядок проведения этапов исследования? Конечно, существует множество возможных путей для того, чтобы заняться мониторингом системы, но все-таки целесообразно проходить этапы исследования именно в предлагаемой последовательности. Мониторинг памяти Чтобы проверить, не является ли память "узким местом", следует воспользоваться утилитой vmstat, которая показывает,в том числе, что происходит с памятью в системе. Для целей оперативного мониторинга хорошим выбором является контрольный интервал в 5 секунд. Вывод утилиты vmstat, представленный на Рисунке 1, демонстрирует систему, в которой не ощущается нехватки памяти:
Рисунок 2 демонстрирует вывод vmstat на той же системе в случае нехватки памяти:
На что следует обращать внимание Прежде всего, обратите внимание на значения показателей po (pageouts - вытеснения страниц из оперативной памяти, количество килобайтов данных, вытесненных из оперативной памяти за секунду) и sr (scan rate - скорость сканирования, количество страниц памяти, отсканированных по алгоритму синхронизации). Когда эти показатели постоянно имеют высокие значения за один и тот же промежуток времени (например, значительно больше 100 (Кбайт или страниц соответственно) в секунду на системе с объемом оперативной памяти до 4 Гбайт, на более мощной системе это значение может быть больше), тогда возможно, что демон страниц вынужден скрывать свободную память от выполняющихся процессов. Необходимо ли увеличить объем памяти в этой системе? Возможно, что да. Однако увеличение памяти может и не помочь. Это могло бы показаться полной бессмыслицей, но к сожалению, здесь не все так просто. Для прояснения ситуации потребуются некоторые дополнительные пояснения. Pageouts (вытеснения страниц из оперативной памяти) могут присходить по целому ряду причин, включая следующие:
Scan rate (скорость сканирования) представляет собой меру активности демона страниц. Этот демон активизируется и начинает искать страницы памяти для освобождения в том случае, когда какое-либо приложение не может найти достаточное количество в списке свободной памяти (память уменьшается до значения, задаваемого параметром lotsfree). Чем больший дефицит памяти, тем быстрее демон страниц будет сканировать страницы в основной памяти. Основными портебителями памяти в системе являются:
Нормальное замещение страниц до Solaris 8 До выпуска Solaris 8 столбец free в выводе утилиты vmstat мог быть не слишком хорошим индикатором наличия доступной памяти в системе. Причина заключалась в том, что коль скоро страницы памяти используются страничным кэшем файловой системы, они больше не возвращаются в список свободной памяти. Наоборот, блоки данных файловой системы остаются в кэше на тот случай, если они снова понадобятся в будущем. Когда демон страниц обнаруживает нехватку памяти и сканирует ее в поисках страниц, которые можно освободить, он вполне может выбрать для освобождения некоторые страницы из страничного кэша файловой системы. Если эти страницы были изменены, то они сначала опрожняются на диск. Не существует никакого простого способа для выяснения того, какая часть основной памяти используется страничным кэшем файловой системы в любой момент времени, но можно быть совершенно уверенным в том, что это будет существенно в том случае, если файлы базы данных расположены в файловых системах UFS, а не на низкоуровневых разделах. Установить размер памяти, используемой файлами UFS, поможет пакет memtool - инструмент мониторинга памяти, разработанный Ричардом МакДугалом. Проблема состоит в том, что демон страниц может освобождать как страницы памяти прикладных программ, так и страничного кэша файловой системы, поскольку он не знает, к чему относится та или иная страница. Результатом могут стать интенсивное замещение страниц и серьезные проблемы с производительностью. Однако и добавление оперативной памяти не слишком поможет в данном случае. Это будет просто означать, что в памяти может кэшироваться большое количество страниц базы данных. К счасьтью, решение существует. Приоритетное замещение страниц Начиная с операционной системы Solaris 7, была добавлена новая функциональная возможность, которая называется priority paging (приоритетное замещение страниц). Эта возможность понижает в памяти приоритет страниц файловой системы таким образом, чтобы демон выбирал их для освобождения перед страницами прикладных программ. Такое поведение может коренным образом изменить проблему замещения страниц; приоритетное замещение страниц нужно разрешать везде, где базы данных сосуществуют с открытыми файловыми системами, особенно в тех случаях, когда файлы базы данных размещены в файловых системах. Чтобы активизировать приоритетное замещение страниц, следует добавить следующую строку в конфигурационный файл /etc/system: set priority_paging = 1 Доступны соответствующие патчи, позволяющие добавить функциональные возможности приоритетного замещения страниц к Solaris 2.5.1 и Solaris 2.6. Начиная с операционной системы Solaris 8, изменения в виртуальной памяти системы подразумевают, что приоритетное замещение страниц больше не требуется и не должно использоваться. Файлы UFS и замещение страниц Если файлы вашей базы данных представляют собой файлв UFS, а не низкоуровневые усторойства, то можно столкнуться с интенсивным сканированием страниц памяти, даже если было разрешено использование приоритетного замещения страниц. Фактически скорость сканирования может даже увеличиться, поскольку приритетное замещение страниц быстрее заставляет демона страниц становиться активным. Такое поведение представляет собой естественное следствие необходимости перенести все страницы базы данных в страничный кэш файловой системы UFS до того, как они смогут стать доступными. Продолжающаяся необходимость поисков свободной памяти влечет за собой ее постоянное сканирование на загруженных серверах, использующих файлы UFS. Если приложение выполняет операции обновления, вставки и удаления данных, то следует также ожидать активизацию вытеснения страниц из оперативной памяти. Все операции записи базы данных также должны пройти через страничный кэш UFS прежде, чем может быть выполнена запись на диск. Хотя страница, записываемая на диск, могла быть предварительно считана в страничный кэш UFS, эта страница могла стать многократно используемой, если скорость сканирования высока. В этом случае страница должна быть повторно считана с диска до того, как сможет продолжаться операция записи на диск. Этот процесс, в свою очередь, замещает другую страницу памяти, и описанный цикл продолжается. Как же можно остановить весь этот процесс замещения страниц? Чтобы исключить сканирование (при этом предполагается, что для ваших приложений вполне достаточно памяти), следует либо использовать низкоуровневые устройства, либо монтировать разделы базы данных с установленным флагом прямого ввода/вывода (forcedirectio). Однако следует иметь в виду, что устранение страничной подкачки с помощью прямого ввода/вывода может не всегда приводить к мгновенному улучшению производительности. Страничный кэш файловой системы действует в качестве кэша второго уровня для страниц базы данных, и его удаление сразу же выявит любые несоответствия в размерах вашего буферерного кэша базы данных. Удостовертесь в том, что размеры буферного кэша базы данных установлены соответствующим образом; в противном случае можно столкнуться с ситуацией, когда в системе будет много свободной памяти, но при этом буферный кэш базы данных будет испытывать нехватку буферов. Разрешение использовать прямой ввод/вывод для файлов базы данных и особенно для ее журналов может дать существенноые преимущества с точки зрения производительности, начиная с Solaris 8 1/01; более ранние версии прямого ввода/вывода могут не обеспечить существенного улучшения призводительности. В заключение хотелось бы сделать следующее предостережение: хотя прямой ввод/вывод может оказаться очень полезным для файлов базы данных, не применяйте его для других файлов, не относящихся к базе данных, без тщательного предварительного исследования того, как он влияет на производительность системы. Нормальное поведение замещения страниц, начиная с Solaris 8 Как вы могли убедиться, приоритетное замещение страниц не гарантирует полного решения проблем производительности. Хотя при выборе демон страниц будет оказывать предпочтение страницам файловой системы перед страницами приложений, этот демон все-таки должен отсканировать всю память, чтобы найти эти страницы. И если используются большие буферные кэши базы данных, страницы файловой системы могут составлять лишь небольшую часть общего объема памяти, значит, потребуется дополнительный поиск. Начиная с Solaris 8, страницы файловой системы учитываются отдельно, поэтому они могут быть освобождены без необходимости сканирования памяти для поиска этих страниц. Следовательно, демон страниц вообще не нужен, если только не существует какой-либо серьезной проблемы с памятью. В результате вероятность возникновения проблем со страничной подкачкой существенно уменьшается. Продолжение углубленного анализа Если необходимо выяснить, на что расходуется память, существует ряд возможностей:
Сценарий procmem требует, чтобы в системе был предварительно установлен пакет под названием memtool (Не поддерживается в Solaris 10 - Прим.sunhelp.ru), не вхлдящий в комплект поставки операционной системы, поскольку сценарий использует программу pmem (аналогичную стандартной программе pmap в Solaris, но с различными ошибками, зафиксированными в различных выпусках Solaris). Некоторые пользователи не желают устанавливать нестандартный пакет программного обеспечения на функционирующей системе, поэтому также доступна альтернативная версия, основанная на программе pmap. Сценарий procmem суммирует использование памяти для всех процессов и дает подробную информацию относительно использования резидентной,разделяемой для совместного использования и личной памяти. Пожалуйста, обратите внимание на то, что и сценарий procmem, и пакет memtool представляют собой неподдерживаемое фирмой Sun программное обеспечение. Передача сценарию procmem параметра -h приводит к выдаче следующей информации об использовании памяти:
Флаг -v предоставляет дополнительную информацию. Приведенный далее пример вывода procmem содержит данные по всем прцессам на некоем сервере Oracle.
Память совместного использования размером 1.3 Гбайт - большая часть из 1.5 Гбайт резидентной памяти, используемой на этом сервере, и одновременно основная часть, задействованная под процессы Oracle. Сценарий procmem может применяться для того, чтобы сообщить о потреблении физической и виртуальной памяти всеми прцессами, которые содержат строку ora в выводе команды ps -ef (процессы Oracle обычно удовлетворяют этому критерию). Если в системе регистрируется другой пользователь Oracle, выполняющий те же самые приложения, то не следует ожидать увеличения значения компонента Shared памяти разделяемых библиотек /usr/lib, других разделяемых библиотек,двоичных файлов или сегментов разделяемой памяти. Можно ожидать увеличения компонента Private для разделяемых библиотек, отбражаемых файлов и анонимной памяти. Требуемая дополнительная личная память приблизительно равна общему количеству личной памяти этих приложений, деленному на текущее число пользователей. Подробная информация доступна для всех прцессов, также как и итоговая сводная для разделяемых библиотек /usr/lib (которые обычно тспользуются многими процессами в системе, а потому при решении задач производительности должны учитываться только однократно), других разделяемых библиотек (например, разделяемых библиотек Oracle), отображаемых файлов (отображаемых в памяти файлов файловой системы), двоичных файлов (исполняемых программ), сегментов разделяемой памяти и анонимной памяти (динамической памяти и стека). Сценарий procmem будет отображать точные сведения обо всей памяти, непосредственно используемой процессами, но не о памяти, принадлежащей файлам UFS, которые являются резидентными в страничном кэше файловой системы. Поскольку страницы файлов базы данных, хранящихся в файловых системах UFS, непосредственно не отображаются в адресные пространства процессов базы данных, они также не будут отображаться в итоговой сводке. Эту информацию предоставляет команда memps -m из пакета memtool: при этом требуется, чтобы был загружен модуль из memtool, который инсталлируется при первоначальной установке этого пакета. Что можно сделать для того, чтобы уменьшить интенсивность страничной подкачки Если вы используете файловые системы для хранения файлов базы данных, то первым шагом должно быть обновление операционной системы до Solaris 8 (или уже Solaris 9) или разрешение применять приоритетное замещение страниц на более ранних выпусках Solaris. В случае необходимости можно также рассмотреть возможность проведения следующих мероприятий, сокращающих проблемы с памятью на сервере:
Мониторинг дисков Если вы дошли до второго этапа, то должны точно знать, что происходит с памятью на вашей системе. Следующим этапом должно стать выяснение того, существуют ли какие-либо "узкие места" в дисковой подсистеме или диски, которые могут скоро стать "узкими местами". Чтобы проверить наличие "узких мест" в дисковой подсистеме, следует воспользоваться утилитами iostat, statit или sar. Попробуйте команду iostat -xn 5 (опция -n, отображающая дисковые имена в формате cntndn, доступна только начиная с Solaris 2.6). Если на вашей системе установлено много дисков, то вывод может быть таким огромным, что в нем даже сложно будет увидеть какой-либо смысл. Можно воспользоваться командой grep для того, чтобы удалить из вывода информацию о неактивных дисках (после проведения анализа того, почему в системе имеются бездействующие диски!):
Не пытайтесь ввести эту команду с клавиатуры - между всеми нулями требуется именно такие разделители, какие показаны в примере. Лучше просто извлечь показанную строку команды grep из вывода утилиты iostat и сохранить ее целиком для использования в будущем в файле под именем iostat2. Если желательно сохранить отчет о работе дисков для дальнейшего использования, то для этого удобным форматом является формат двоичного файла, формируемого утилитой sar, поскольку в нем каждая точка данных имеет связанную с ней временную метку. На что следует обращать внимание Часть вывода утилиты statit, приведенная на рисунке 3, показывает поведение трех дисков. Первый диск используется полностью, третий - адекватно, а второй почти бездействует. Ключевой информацией являются показатели util% (использование диска в процентах) и srv-ms (время обслуживания в миллисекундах). Обратите внимание на то, что компонент "время обслуживания" (время, необходимое, чтобы завершить ввод/вывод на данном диске) имеет некорректное наименование. Фактически это время отклика диска, то есть время, взятое для завершения операции ввода/вывода из времени драйвера дискового устройства на хосте, включая эффекты организации очереди на контроллере и самом диске. Утилита iostat также выводит аналогичные значения: util% отображается как %b, а srv-ms - как svc_t.
Для рабочих нагрузок OLTP, если использование диска постоянно превышает около 60% или время отклика постоянно превышает 35 миллисекунд, то вполне вероятно, что нагрузка на этот диск может негативно сказываться на производительности прикладных программ. А вот для рабочих нагрузок DSS использование диска может превышать 60%, а времена отклика могут превышать 35 миллисекунд, и даже для единственного перемещения 1 Мбайт данных с диска емкостью 36 Гбайт может потребоваться 35 миллисекунд. Поле wtqlen на рисунке 3 (соответствует показателю wait в выводе iostat) сообщает, сколько других запросов ввода/вывода стоят в очереди и соответственно какая часть времени отклика связана с организацией очереди. Поле svqlen на рисунке 3 (соответствует показателю actv в выводе iostat) показывает количество запросов, покинувших очередь и активно обрабатываемых. Если длины очередей постоянно больше 1.0, а время отклика постоянно превышает 35 миллисекунд, то вполне вероятно, что нагрузка на этот диск может негативно сказываться на производительности прикладных программ. Для обоих типов рабочих нагрузок ключевой проблемой является проверка того, насколько нагружены другие диски. Желательно избегать ситуации, когда некоторые диски будут нагружены, а другие будут простаивать. С этой точки зрения показатели использования дисков и времени обслуживания, показанные на рисунке 3, свидетельствуют об очень неудачном размещении данных на дисках. Часть вывода утилиты iostat (команда iostat -xn 5) представлена в качестве образца на рисунке 4.
Использование дисков, показанное в этом выводе, как и в предыдущем случае, является несбалансированным, откуда следует, что необходимо внести усовершенствования в размещение данных на дисках. Некоторые утилиты, такие как sar, например, сообщают имена дисков в формате sdn или ssdn, а не в формате cntndn. Выявив в системе диск с частыми обращениями к нему, может оказаться затруднительным определить вопрос по данному диску. Благодаря файлу /etc/path_to_inst можно преобразовать имя диска в формат, более пригодный для распознавания. Указанная процедура иллюстрируется далее. Предположим, что в выводе утилиты sar на хосте pae280 обнаружен диск с именем ssd4. Прежде всего необходимо получить дополнительную информацию о диске ssd4.
Сложная строка, возвращаемая из файла /etc/path_to_inst (первая строка, заключенная в двойные кавычки), соответствует подробной информации для данного диска в дереве /devices. Элементы в каталоге /dev/rdsk (а также в каталоге /dev/dsk) фактически представляют собой символические ссылки на дерево /devices, поэтому мы можем выполнить поиск указанного выше элемента в каталоге /dev/rdsk:
Этот заключительный шаг показывает, что диск, соответствующий имени ssd4 - это /dev/rdsk/c2t1d0s2. Можно использовать ту же самую процедуру, соответственно заменяя 4 и ssd на первом шаге. Возвращенная строка может быть после заменена строкой, начинающейся с /pci на втором шаге. Продолжение углубленного анализа Обратите внимание на то, что последние версии утилиты iostat имеют опцию -p, которая отображает статистику для каждого разделе диска. Эта опция может быть полезна в том случае, когда необходимо точно отследить, каое именно устройство базы данных ответственно за проблемы производительности. Для систем, использующих Veritas Volume Manager, вывод информации по разделам является менее полезным, поскольку Veritas размещает все свои тома в разделе 4. Однако Veritas предоставляет программу vxstat, позволяющую провести мониторинг активности ввода/вывода для каждого тома. Эта программа является бесценной при проведении углубленного анализа и позволяет найти тома, связанные с интенсивным вводом/выводом, что особенно важно в тех случаях, когда несколько томов размещаются на одном и том же физическом диске. Утилита vxstat может быть запущена следующим образом:
где group - группа, interval - интервал мониторинга, iterations - количество итераций. Будьте осторожны! В отличие от программ vmstat и iostat статистика, сообщаемая утилитой vxstat, предоставляет итоговые значения показателей за весь интервал, а не за секунду. Следовательно, необходимо разделить сообщенное количество прочитанных и записанных байтов на число секунд в интервале (чтобы получить количество прочитанных и записанных байтов за секунду) и также на 1024 (чтобы получить количество прочитанных и записанных килобайтов за секунду). Что можно сделать, чтобы избежать "узких мест" Чтобы преодолеть "узкое место" дисковой подсистемы, попробуйте применить один из предлагаемых способов:
Эффективное размещение данных на дисках позволит избежать большинства "узких мест" дисковой подсистемы. Мониторинг сети После проверки оперативной памяти и дисковой подсистемы на предмет выявления "узких мест" остановите свой взгляд на любых сетях, соединенных с данным сервером. Хотя маловероятно, что "узкие места" в сети окажут непосредственное влияние на производительность сервера базы данных, они могут оказывать существенное воздействие на время отклика в приложениях. Если приложения базы данных выполняются в режиме клиент/сервер, то медленная сеть между клиентом и сервером будет воздействовать на взаимоотношения между базой данных и прикладными программами. Если медленная сеть находится между приложениями и интерфейсом пользователя, то весьма вероятно, что с точки зрения пользовательского восприятия сервер базы данных покажется медленным. На что следует обращать внимание Простой способ определения воздействия времени задержки в сети на время отклика состоит в том, чтобы зарегестрировать время циклического маршрута, то есть, время прохождения от клиента до сервера и обратно пакетов, посылаемых утилитой ping, и построить соответствующий график. Следующая команда пингует хост adelaide через каждые 5 секунд и сообщает о времени прохождения циклических маршрутов в миллисекундах.
Некоторые прикладные транзакции влекут за собой многочисленные обращения к серверу базы данных, причем, каждое из них связано с издержками циклических маршрутов. Известны случаи, когда существенная доля времени отклика приложения объяснялась сетевыми задержками в глобальных сетях. Один эффективный способ количественного определения времени отклика приложения в глобальной сети состоит в том, чтобы ввести фиктивную транзакцию с помощью эмулятора дистанционного терминала или браузера и измерять время отклика. Фиктивные транзакции могут вводиться с каждого дистанционного рабочего места через регулярные интервалы времени. Время отклика транзакций вместе со временем прохождения циклических маршрутов, зафиксированными с помощью утилиты ping, могут помочь определить, оказывает ли сервер или сеть существенное влияние на производительность. Утилита netstat показывает активность пакетов в некоторй сети; пример использования этой утилиты приведен на рисунке 5.
Обращайте внимание, если количество конфликтов (показатель colls) составляет свыше 10% количества выходных пакетов (показатель output packets). Использование коммутаторов делает конфликты менее серьезной проблемой, чем раньше, когда множество устройств совместно использовали одну и ту же подсеть. К сожалению, приведенный отчет утилиты netstat отображает лишь количество посланных и полученных пакетов, но не их размер. Без знания размера пакетов трудно оценить эффективную производительность сети. Чтобы представить данные не только о количестве пакетов, но и о количестве байтов, переданных по сети, существует ряд доступных инструментов. Сценарий tcp_mon, который является частью инструментария SE, сообщает информацию сетевого траффика в пакетах и байтах. Ради простоты разделите теоретическую полосу пропускания сети на 10, чтобы получить эффективную пропускную способность сети в мегабайтах. Итак, производительность 10-мегабитной подсети Ethernet не превзойдет 1 Мбайт в секунду, а производительность 100-мегабитной подсети Ethernet - 10 Мбайт в секунду. Недокументированная опция утилиты netstat, -k, сообщает о количестве пакетов, полученных и посланных каждым сетевым интерфейсом (соответственно ipackets и opackets). Начиная с Solaris 2.6, команда netstat -k сообщает также о количестве посланных и полученных байтов (соответственно rbytes и obytes). Утилита kstat, введенная в Solaris 8, позволяет избирательно извлекать сетевую статистику. Следующий пример отображает количество пакетов и байтов, посланных и полученных всеми сетевыми интерфейсами на хосте apollo.
В приведенном примере представлены такие сетевые интерфейсы: два 100-мегабитных интерфейса Ethernet (hme0 и hme1), коммутируемое соединение по протоколу PPP (ipdptp) и интерфейс петли, или обратной связи (lo), предназначенный для кольцевой тестовой проверки. Приведенные численные значения являются совокупными; они представляют собой общее количество, начиная с последней перезагрузки системы. Вычисление средних размеров пакетов (rbytes/ipackets и obytes/opackets) показывает, что средний пакет, посланный через этот интерфейс, имел размер, равный 819 байт. Хотя здесь основное внимание уделяется серверам баз данных, а не файл-серверам NFS, для полноты изложения следует отметить, что утилита nfsstat осуществляет мониторинг траффика NFS. На клиентской системе следует воспользоваться командой nfsstat -c. Во время работы сервера обращайте внимание на тайм-ауты, превышающие более чем на 5% вызовы, и на сообщения "not responding": они свидетельствуют либо о наличии сетевых проблем, либо о перегрузке файл-сервера NFS. Начиная с Solaris 2.6, утилита iostat также показывает монтирования файловых систем NFS, поэтому вся дисковая статистика, доступная при использовании утилиты iostat, доступна также для монтирований NFS. Что можно сделать, чтобы минимизировать "узкие места" в сети Чтобы преодолеть "узкие места" в сети, попробуйте воспользоваться одним из следующих приемов:
Обратные ссылки
URI этой записи для создания обратных ссылок (trackback)
Нет обратных ссылок
|
КатегорииБыстрый поискКалендарь
Новостные лентыАвторы |
|||||||||||||||||||||||||||||||||||||||||||||||||
|
|



