Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Обучение от Mail.Ru Group.
Онлайн-университет
для программистов с
гарантией трудоустройства.
Набор открыт!
2005 г.

Бои не в своей весовой категории

Валентин Седых
"Экспресс-электроника", #07/2005
Мы уже неоднократно писали о том, что архитектура процессоров Opteron компании AMD при всей своей привлекательности является конкурентом скорее линейки Intel Xeon, нежели процессоров семейства Itanium 2. Но как только дело доходит до восьмипроцессорных решений, с этим можно не согласиться.

Но начнем мы с небольшого теоретико-исторического экскурса на тему мультипроцессорных систем, напомним основные принципы параллельных вычислений, а также определимся с понятиями.

Мультизадачность, SMP-системы и кластеры

Само по себе понятие "параллельная обработка" подразумевает такое выполнение программы, при котором несколько инструкций исполняются сразу несколькими процессорами, необязательно центральными (CPU). Например обработка данных будет параллельной и в том случае, если компьютер одновременно ведет расчет и производит запись на жесткий диск. В этих условиях работают и центральный, и периферийный процессоры (контроллер жесткого диска чипсета материнской платы), а время выполнения программы в целом существенно сокращается.

Еще одним шагом на пути увеличения общей производительности систем стало появление мультизадачных операционных систем, которые могут функционировать с одним центральным процессором. Такая ОС выделяет квант процессорного времени для каждой из задач (с учетом их приоритетности), из-за чего у пользователя создается впечатление, что выполнение задач распараллеливается. Несложно догадаться, от мультипроцессорные системы на базе мультизадачных ОС гарантируют наибольший прирост быстродействия. В этом случае борьба приложений за ресурсы практически упраздняется, в результате данные каждого из приложений могут быть обработаны более оперативно.

Идея создания мультипроцессорных мультизадачных вычислительных комплексов не нова и будоражила головы создателей едва ли не со времени появления самых первых ЭВМ. Так, в ранних мультипроцессорных системах их конструкторы пытались организовать мультипроцессорные комплексы таким образом, что связь между процессорами осуществлялась по принципу "главный - подчиненный". В этих условиях главному процессору отводилась задача управления всем комплексом подсистем вычислительного комплекса, тогда как подчиненные выполняли лишь те задания, которые им адресовали. Понятно, что эффективность и скорость работы такой системы из-за больших административных задержек была невысокой. Кроме того в начале эволюции мультипроцессорных систем техника их эффективного программирования не была развита настолько, чтобы предоставить программам возможность задействовать ресурсы кооперативно. Решение описанной проблемы и привело к созданию симметричных мультипроцессорных систем (Symmetric Multiprocessing - SMP), которые стали сегодня самой распространенной мультипроцессорной архитектурой.

Главная особенность таких систем в том, что все процессоры имеют одинаковые права для доступа ко всем системным ресурсам и управлению ими. На практике получается, что все процессоры симметричной системы видят ее ресурсы одинаково, не подозревая о существовании "коллег". Роль администратора в вопросах распределения задач между процессорами отводится операционной системе, которая самостоятельно решает, которой из ветвей задачи нагрузить тот или иной процессор.

Так как оперативная память для процессоров также является разделяемым ресурсом, доступ к ней от процессоров должен осуществляться по единой шине. Сразу отметим, что симметричность системы относительно памяти - весьма важное преимущество SMP-систем, ведь в таком случае на всех процессорах может выполняться только одна копия операционной системы. Если все процессоры, которые разделяют системную память, разделяют и единый образ этой памяти (грубо говоря, используют одни и те же "координаты" данных), то говорят о когерентной (согласованной) памяти. На практике же получается, что все процессоры читают байт по одному и тому же адресу и получают одинаковое значение этого байта. Немаловажно, что в процессорах со встроенной кэш-памятью ее содержимое тоже должно быть согласовано с системной памятью. Сегодня существует целый ряд механизмов, позволяющих поддерживать когерентность данных на всех уровнях.

Что касается соединения процессоров и контроллера памяти, наиболее распространенное решение заключается в использовании одной системной шины. Впрочем, такая архитектура плохо масштабируется, ведь при увеличении числа процессоров шина становится своеобразным бутылочным горлышком для всей системы. Причем какой бы широкой полоса пропускания в этом случае ни была, ее все равно будет недостаточно, так как одну-единственную физическую шину в определенный момент времени все равно придется делить надвое.

Для преодоления ограничения были разработаны другие решения. Среди них наиболее распространена архитектура с иерархией шин. Несколько процессоров объединяются одной шиной в узел, а узлы подсоединяются к общей более производительной шине, соединяющей их с контроллером памяти и другими контроллерами набора системной логики. Надо сказать, что такой подход наиболее близок к тому, что мы можем видеть в современных мультипроцессорных решениях компании Intel.

Впервые SMP-системы на базе процессоров Intel появились в 1993 году. Именно тогда корпорация опубликовала спецификацию MultiProcessor Specification (MPS), в которой очертила будущее мультипроцессорных систем на базе своих процессоров. Главной особенностью этой спецификации стало стремление создать стандартный интерфейс для мультипроцессорной платформы, который позволил бы не только получить решения более производительные, чем однопроцессорные, но и сохранить 100%-ную совместимость с ними. Другое отличие SMP от Intel также в том, что система перестает быть симметричной при загрузке и выключении. В эти моменты один из процессоров назначается процессором загрузки (BootStrap Processor), тогда как остальные - процессорами приложений (Application Processors). В итоге BootStrap Processor несет ответственность за инициализацию системы и загрузку ОС, после чего переименовывается в Application Processor и активирует остальных.

Проблема обеспечения корректной работы с аппаратными прерываниями в системах Intel решается с помощью усовершенствованных программируемых контроллеров прерываний (Advanced Programmable Interrupt Controller - APIC), которые встраиваются в каждый элемент системы, предусматривающий генерирование сигнала прерывания. Кроме внешних устройств сигналы прерывания используются также процессорами для межпроцессорных коммуникаций (InterProcessor Interrupts - IPI). Все контроллеры APIC объединяются выделенной шиной межпроцессорных коммуникаций Interrupt Controller Communications bus (ICC bus). Поэтому стоит понимать, что вовсе не процессоры являются "сердцем" SMP-системы. Куда более важную роль играет набор системной логики.

Так, в системах на базе Xeon/Itanium 2 используется одна общая полудуплексная шина, которая в случае интенсивного обращения к ОЗУ становится узким местом. Единственный выход из положения - наличие в процессорах собственного объемного кэша, что, кстати, и объясняет такие стремительные темпы его роста в линейках процессоров Xeon и Itanium 2. Делается это с целью уменьшить количество запросов к оперативной памяти, снизив таким образом латентность обработки запросов к системе в целом.

Но существуют и другие решения, позволяющие более эффективно объединять множество процессоров под сводами одной системы. Одно из них подразумевает использование коммутируемой памяти, когда каждый процессор получает доступ к требуемому участку памяти по коммутируемому каналу. Когерентность памяти для коммутируемой архитектуры обеспечить проще, чем для шинной, в результате такие системы лучше масштабируются, а их скорость отклика зачастую оказывается выше.

Описанная топология характерна, например, для современных многопроцессорных решений от AMD. Причем инженеры компании пошли даже дальше, разрабатывая решение, способное обработать максимальное количество запросов. Коммутация между процессорами AMD может изменяться в зависимости от того, в какой области памяти находятся необходимые для вычислений данные.

Нестандартная организация узла "процессор - память" (контроллер памяти интегрирован в кристалл процессора) в системе AMD предполагает свой принцип построения чипсетов. Так, чипсет под Opteron - AMD-8000 - не содержит привычных северного и южного мостов. Он состоит из так называемых туннелей-контроллеров, имеющих на входе одну полосу пропускания, а на выходе - другую, при этом разница пропускных способностей может использоваться для своих целей. Набор логики поддерживает соединение в цепочку произвольного количества туннелей, что позволяет получать системы различной сложности и с различными характеристиками. Используя возможности шины HyperTransport, AMD-8000 может стать решением для одно-, двух- и восьмипроцессорных систем. Наибольшее преимущество такого подхода - в практически линейном росте производительности при увеличении количества CPU. Получается, что на подобных системах одинаково хорошо решаются как задачи, оптимизированные для параллельного выполнения на уровне алгоритмов, так и обычные многопоточные приложения.

Однако затрагивая вопрос о параллельных вычислениях, нельзя не вспомнить о кластерах. Сегодня развитие технологий широкополосных коммутаций достигло того уровня, когда достаточно эффективно соединить несколько компьютеров оказывается не так сложно и дорого, как обзавестись законченным многопроцессорным решением. При этом, помимо меньшей стоимости по сравнению с многопроцессорными системами, несложные кластеры предлагают еще и более эффективную обработку многопоточных приложений, чем в архитектуре с иерархией шин (подход Intel). Чтобы убедиться в этом, достаточно обратиться к закону Амдала (Amdahl's law), который связывает производительность отдельно взятого вычислителя (узла кластера) с высокоуровневой архитектурой. Фактически его можно считать фундаментальной оценкой максимальной производительности абстрактной параллельной вычислительной машины.

Не вдаваясь в подробности теории Джина Амдала (Gene Myron Amdahl), скажем, что формулировка закона гласит о том, что эффективность кластера зависит от двух параметров - количества процессоров и доли последовательных операций в программе (зависимость не линейна). Следствие из закона Амдала: идеальная характеристика прироста производительности (в n раз при n процессорах) в реальности недостижима, так как возможна лишь в случае, когда последовательно исполняемая часть программы равна нулю.

Наиболее важные выводы из закона Амдала заключаются в следующем. Первый: при достаточно большой доле нераспараллеливаемых команд (С=20%) в коде программы после определенного числа вычислителей (20) наблюдается прекращение роста производительности. Это отражено на графике 1. Второй: наиболее эффективный способ повышения производительности - не увеличение числа вычислителей, а алгоритмическое совершенствование задач. Это особенно хорошо заметно, если закон Амдала представить в виде зависимости прироста производительности от процента содержания нераспараллеливающейся части кода (график 2).

g1.gif

График 1.



g2.gif

График 2.

Вследствие того, что не все задачи хорошо распараллеливаются, в некоторых из них наиболее оптимальным решением все же остаются многопроцессорные системы, а не кластеры. Кроме того, говоря о большей эффективности мультипроцессорных конфигураций, нельзя не вспомнить и о большей скорости реакции последних из-за более высокой скорости между элементарными вычислителями (процессорами).

Проецируя описанную теорию на пример с восьмипроцессорными системами, скажем, что по уровню производительности они почти всегда превосходят четыре двухпроцессорных узла, которые уже сегодня, по мнению опрошенных нами участников рынка, являются наиболее актуальными высокопроизводительными системами в России. Именно они обеспечивают уровень мощности, производительности и надежности, необходимый для приложений с большими объемами вычислений и интенсивным использованием памяти, например в крупных базах данных, системах управления бизнес-процессами и принятия решений. И хотя "наколенные" кластеры зачастую оказываются дешевле моноблочных многопроцессорных систем, сегодня пока сложно сказать, смогут ли они окончательно вытеснить многопроцессорные серверы. Но оставим вопрос перспектив до итоговой части статьи и перейдем к обзору конкретных решений.

Обратная сторона Луны

Подчеркнем, что основная особенность мультипроцессорных систем, да и вообще любых систем, подразумевающих распараллеливание ресурсов, в том, что она почти никогда не соответствует уровню суммарной производительности отдельно взятых процессоров. Причем степень отставания реальной производительности от идеальной (когда загрузка всех процессоров приближается к 100%) зависит, в основном, от топологии набора системной логики, а также способа связи процессора и подсистемы памяти.

Среди доступных сегодня на рынке решений, способных стать полигоном для разворачивания высокопроизводительных систем корпоративного уровня, выделяются продукты компании AMD. Ничего революционного они в себе не несут (некоторые решения, использованные в них, уже достаточно давно были применены, например в системах IBM), но учитывая их широкую доступность в виде конструкторских блоков, любой заказчик получает возможность чуть ли не самостоятельно собрать систему, приближенную по уровню производительности к системам масштаба предприятия.

Почему, говоря о решениях масштаба предприятия, мы заговорили о процессорах компании AMD Opteron, а не о чипах линейки Itanium 2, изначально ориентированных на предприятия, или кластерных системах на более легких процессорах? Во-первых, как мы уже отметили, кластеры при всех своих достоинствах имеют один существенный недостаток - низкую, по сравнению с многопроцессорными конфигурациями, скорость реакции, обусловленную задержками во внешних коммуникациях, и низкую эффективность в случае обработки плохо распараллеливаемого потока команд. А во-вторых, как бы странно это ни звучало, восьмипроцессорные системы с процессорами Itanium 2 на базе доработанной версии чипсета E8870 (с дополнительной микросхемой 8870SP) канонической SMP-системой все же не являются. По всем параметрам это скорее достаточно быстрый в плане внешних коммуникаций кластер на базе двух серверов с чипсетами E8870, где роль транспорта между последними выполняет последовательная двунаправленная шина общей производительностью до 12,8 Гбайт/с.

Но даже если закрыть на это глаза, говорить о конкуренции Xeon MP и Opteron 8xx на поприще восьмипроцессорных систем не приходится. Дело в том, что подобные решения на базе Xeon MP попросту не предусмотрены. Наиболее современный и производительный чипсет под платформу Xeon MP - Intel E8000 - поддерживает только четырехпроцессорные конфигурации. Вот и выходит, что в виду отсутствия альтернативы со стороны прямого конкурента - Xeon MP, процессоры Opteron 8xx автоматически зачисляются в соперники Itanium 2.

Реализации и примеры

Чем живет рынок восьмипроцессорных систем сегодня? Начнем, пожалуй, с систем на базе процессоров Intel как превалирующих на рынке. Есть несколько моделей процессора Itanium в вариантах MP (Multi-Processor) и DP (Dual Processor) с тактовыми частотами до 1,6 ГГц (существует также низковольтная линейка (LV). К первому типу (MP) относятся продукты, предназначенные как раз для применения в многопроцессорных системах - Itanium 2 1,6 ГГц с 9 Мбайт кэша L3 и FSB 533 МГц ($4226 в партиях по 1000 шт.), Itanium 2 1,6 ГГц с 6 Мбайт кэша L3 ($1980) и Itanium 2 1,5 ГГц с 4 Мбайт кэша L3 ($910). Ко второму (DP) - чипы для двухпроцессорных вычислений: Itanium 2 1,6 ГГц, 3 Мбайт кэша L3, FSB 533 МГц ($1172) и Itanium 2 1,6 ГГц, 3 Мбайт кэша L3, FSB 400 МГц ($851). Третья категория (LV) в настоящее время включает низковольтный Itanium 2 1,3 ГГц с 3 Мбайт кэша L3 ($530), потребляющий 63 Вт. Он ориентирован на использование в системах базового уровня и сверхплотных серверах.

См. Рисунок

С точки зрения создания восьмипроцессорных систем наиболее интересен чипсет Intel E8870 (Intel 870). На самом деле он разработан для двух- и четырехпроцессорных серверных платформ высшего уровня и состоит из следующих основных компонентов: Intel E8870IO (SIOH), Intel E8870 (SNC), Intel E8870DH (DMH), Intel 82870P2 PCI/PCI-X (P64H2), Intel 82801DB (ICH4). Однако использование уже упомянутой микросхемы Intel E8870SP (E8870SP Scalability Port Switch, SPS) позволяет расширить возможности НМС Intel E8870 и создавать системы с восемью процессорами Itanium 2.

Основные характеристики Intel 8870: 400 МГц, 128-разрядная системная шина, что обеспечивает скорость передачи данных до 6,4 Гбайт/с, очень большой объем оперативной памяти: концентратор DMH предоставляет в сумме 32 разъема для установки памяти на каждый процессорный узел, в итоге максимальный объем составляет 128 Гбайт (с 4 DDR Memory Hubs).

Чипсет поддерживает два масштабируемых порта с высокой пропускной способностью. Четыре соединения интерфейса Hub Interface 2.0 имеют пропускную способность 1 Гбайт/с на каждое соединение, что позволяет применять до четырех 64-разрядных контроллеров PCI/PCI-X (P64H2) с интерфейсом HI 2.0. Имеется механизм предзагрузки данных и встроенная кэш-память системы ввода/вывода. Высокопроизводительный мост PCI/PCI-X обеспечивает поддержку всех устройств ввода/вывода PCI/PCI-X I/O, начиная от устаревших PCI и заканчивая высокопроизводительными PCI-X на частоте 133 МГц (каждый контроллер P64H2 содержит два независимых 64-разрядных канала PCI-X с максимальной частотой 133 МГц). Кроме того комбинация таких характеристик, как модули hot-plug для процессора и памяти, обнаружение и коррекция ошибок, восстановление сбоев устройств памяти (MDFR), резервные пути ввода/вывода, делает платформу более надежной, уменьшает время простоев при ремонте и обеспечивает целостность передачи данных по всем соединениям и шинам.

Читатель, наверное, обратил внимание на количество микросхем, образующих чипсет Intel 8870 - даже для четырехпроцессорной конфигурации оно равняется восьми (и это только в случае использования одного контроллера PCI-X). В случае же создания восьмипроцессорной системы это число возрастает минимум до 20 микросхем (!), поэтому создание решений на базе Itanium 2 - кране сложная и трудоемкая задача. Учитывая только лишь эти особенности реализации данной платформы, понимаешь, почему стоимость серверов на базе Itanium столь высока.

А вот во время знакомства с реализациями восьмипроцессорных систем на базе архитектуры AMD Opteron 8xx, понимаешь, что они привлекательны не только, что называется, на листе. Особенно это становится заметно в сравнении с реализациями восьмипроцессорных систем на базе Itanium 2.

Судите сами: полновесная восьмипроцессорная система (имеется поддержка PCI-X, PCI Express, 2?Gigabit Ethernet, SATA II) на базе системной платы Tyan Transport VX50 (впрочем, единственной в своем роде) использует всего две микросхемы. По сути, в ней применяется чипсет nForce4 Professional (аналог AMD-8000) и мост AMD-8131 для поддержки PCI-X.

Наиболее современные одноядерные процессоры AMD Opteron 852 работают на тактовой частоте 2,6 ГГц и поддерживают набор инструкций SSE3. Емкость кэш-памяти второго уровня составляет 1 Мбайт. Обмен данными между чипами и системной логикой осуществляется по шине HyperTransport, работающей на частоте 1 ГГц (800 МГц - для процессоров Opteron предыдущего поколения). Они производятся по 90-нм техпроцессу, максимальное энергопотребление составляет 93-95 Вт. Кроме того в них реализована фирменная технология снижения энергопотребления AMD PowerNow. Стоимость процессоров Opteron 852 составляет $1514 в партиях от 1000 штук.

2.gif

Топология многопроцессорного решения AMD

Ну и пожалуй, самая интересная информация: компания AMD помимо одноядерных процессоров предлагает серверные двухъядерные чипы, среди которых и Opteron линейки 8xx. Многоядерная новинка получила название Dual-Core AMD Opteron 800 и предназначена для применения в четырех- и восьмипроцессорных серверах. В настоящее время компания предлагает три версии двухъядерных Opteron стоимостью от $1514 до $2649 (в партиях по 1000 шт.) и с тактовой частотой от 1,8 до 2,2 ГГц. Стоит ли говорить, что с учетом гибкости архитектуры AMD, восьмипроцессорные системы превращаются в весьма интересно организованные 16-процессорные? Причем в сравнении с еще не объявленными двухъядерными Intel Xeon MP или Itanium MP (которые будут не более чем 16-процессорными, с разделением шины), Dual-Core Opteron вновь оказывается в более выгодном положении. У многопроцессорных систем Intel для всех установленных процессоров всегда использовалась общая процессорная шина, тогда как решения AMD обладают и общим контроллером памяти, и одним на два ядра контроллером процессорной шины. Взаимодействие каждого из ядер с разделяемыми ресурсами осуществляется посредством специального Crossbar-переключателя и очереди системных запросов. Кроме того, два ядра на одном кристалле в процессорах AMD используют полнодуплексный интерфейс HyperTransport, что актуальнее разделяемой шины Intel. На этом же уровне организовано и взаимодействие ядер между собой, благодаря чему вопросы когерентности (равноценности содержимого) кэшей решаются без дополнительной нагрузки на системную шину (и без того рационально загруженную) или шину памяти.

В качестве эпилога

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

Резюмируя вышесказанное, можно очертить и круг применения этих систем - поддержка важных бизнес-приложений: баз данных и тяжелых приложений (например систем управления ресурсами предприятия), корпоративной почты, систем управления взаимоотношениями с заказчиками, биллинговых систем и других. Такие приложения востребованы практически во всех секторах экономики и при пересечении организацией определенных границ по объему обрабатываемой информации. Среди таких организаций банки, телекоммуникационные и страховые компании, промышленные предприятия, государственные учреждения и т. д.

Понятно, что закупка систем среднего уровня проходит в этих сферах как в рамках создания новых информационных систем, так и в рамках обновления парка имеющегося оборудования. При этом системы среднего уровня уже редко закупаются "коробочным" способом - сложность и стоимость техники возрастают, соответственно, растут и риски от ее неэффективного использования.

В любом случае при выборе вычислительных систем необходимо отталкиваться от задач, для решения которых эта вычислительная система и закупается. Лишь на глубоком анализе исполнения приложений можно сделать действительно обоснованный выбор в ту или другую сторону (для одного типа приложений лучше использовать процессор Intel Itanium 2, а для другого - AMD Opteron). Каких-либо правил выбора существовать не может.

Комментарий специалиста.
Вячеслав Елагин, руководитель направления Корпоративные серверные решения компании "Ай-Теко"
Я считаю, что сравнение AMD Opteron и Intel Itanium 2 все же некорректно. Конечно, если использовать различные известные методы анализа (иерархий, парного сравнения), позволяющие сравнивать яблоко с апельсинами, можно сравнить и системы на AMD Opteron и Intel Itanium2. Но используя общепринятые мерки, я все-таки разнесу их в несравниваемые категории. Корректно сравнивать системы в аналогичных весовых категориях (на то они и существуют), например Power5 и Itanium2, Xeon или Opteron, Athlon или Pentium4. Можно, конечно, сравнить Power5 и Pentium4, но результаты будут лежать за пределами здравого смысла. Говоря о таких критериях, можно привести в качестве примера способность выполнять x86-совместимый код. На мой взгляд, нельзя вечно использовать одну и ту же технологию, для развития иногда бывает необходимо сделать ход, связанный с отсеканием накопившегося. Сложно сейчас представить технически грамотного специалиста, который закупал бы себе машину Pentium4 или Athlon под задачу, работающую под управлением операционной системы Windows 3.11 - скорее он предпочтет "новый" 286 компьютер. Windows 3.11 не поймет практически ни одного устройства, которые имеют сейчас современные компьютеры. Несмотря на то, что под Windows 3.11, NT, 98, 95 написано несметное количество различных приложений, эти системы мы почему-то перестали покупать. Обычно современные системы среднего уровня покупают под современное ПО. Если брать пример из области товаров народного потребления, то DVD-проигрыватель вообще не умеет воспроизводить VHS-кассеты. Вопрос сравнения возможностей AMD Opteron и Intel Itanium 2 исполнять x86 код - не технический, а финансовый.

Новости мира IT:

Архив новостей

Последние комментарии:

Релиз ядра Linux 4.14  (7)
Среда 22.11, 11:59
Loading

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...