UcallWeconn

Праблема C10K


Original on http://www.kegel.com/c10k.html

[ Дапамажыце выратаваць лепшы Linux крыніцы навін на вэб - падпісацца на Linux Weekly News! ]

The article translation is provided by cheap international calls company UcallWeconn, which also sponsored the creation of complete international calling guide

Як вы думаеце, для вэб-сервераў апрацоўваць дзесяць тысяч кліентаў адначасова магчыма? Так, вэб цяпер валодаюць вялікімі магчымасцямі.
І кампутары таксама занадта вялікія. Вы можаце купіць 1000MHz машыну з 2 гігабайтамі аператыўнай памяці і картамі Ethernet 1000Mbit/sec за $1200 ці каля таго. Давайце паглядзім, 20000 кліентаў, гэта 50KHz, 100Kbytes, і 50Kbits/sec на кліента. Гэта не павінна спажыць значных высілак, калі узяць чатыры кілабайты з дыска і адправіць іх у сеткі за секунду для кожнага з дваццаці тысяч кліентаў. (Гэта абыйдзецца $0,08 для кліента. Тыя $100/client ліцэнзійннага збору, што ажыццяўляюць некаторыя аперацыйныйныя сістэмы, можна палічыць некалькі абцяжарваючым грузам.) Так што абсталяванне ніколі не стане вузім месцам
У 1999 годзе адным з самых ажыўленых участках FTP, cdrom.com, фактычна было апрацавнаі 10000 кліентаў адначасова праз шлюз Gigabit Ethernet. У 2001 годзе па хуткасці у наш час прадстаўлена некалькі правайдараў ён стаў папулярнейшым у асяродку буйных бізнэс-кліентаў.
Для абслугоўвання кліентаў сёння прыцягваюцца і тонкія вылічальныя рэсурсы, што паднімае прэстыж Інтэрнета.
Маючы гэта на ўвазе, прапануем некалькі нататкаў пра тое, як наладзіць аперацыйныя сістэмы і пісаць код для падтрымкі тысяч кліентаў. Абмеркаванне цэнтраў Unix-падобных аперацыйных сістэм, як гэта мае асабістыя вобласці інтарэсаў, ў якіх кантэкстна разлядаецца і Windows.

Змест

Сайты па тэме

У кастрычніку 2003 гады, Фелікс фон Лейтнер сабраць выдатны вэб-старонкі і прэзентацыі пра маштабаванасць сеткі, у камплекце з крытэры параўнання розных сістэмных выклікаў сетак і аперацыйных сістэм. Адзін з яго назіранняў з'яўляецца тое, што 2.6 Linux ядры сапраўды збілі ядры 2.4, але ёсць шмат, шмат добрых графаў, які дасць распрацоўнікам ежу для разважанняў АС на працягу некаторага часу. (Гл. таксама Slashdot каментары; гэта будзе ці цікава хтосьці Наступныя тэсты на паляпшэнне ў выніках Фелікс.)

Кнігі для чытання першых

Калі вы не чыталі гэта ўжо, пайсці і атрымаць копію Unix Сеткі Праграмаванне: сеткавых API-інтэрфейсаў: Раздымы і Xti (том 1) на канцы У. Рычард Стывенс. У ім апісваюцца шматлікія з I/O стратэгіі і праблемы, злучаныя з пісьмовай высокапрадукцыйных сервераў. Ён нават кажа о "грымотны статак" праблемы. І ў той час як вы на яго, ісці чытаць Дарсі адзначае Джефф на прадукцыйнасць сервера дызайн-высокая.

(Іншая кніга, якая магла б быць больш карысным для тых, хто * выкарыстанне *, а не * Даць * вэб-сервер Пабудова якія маштабуюцца вэб-сайтаў ад Cal Henderson).

I/O рамкі

Пафасаваных бібліятэкі даступныя, што некаторыя абстрактныя метады, прадстаўленыя ніжэй, ізаляцыйныя код з аперацыйнай сістэмы і зрабіць яго больш партатыўным.

  • ACE, суперцяжкім C + + I/O рамкі, утрымоўвае аб'ектна-арыентаванай рэалізацыі некаторых з гэтых I/O стратэгіі і шмат іншых карысных рэчаў. У прыватнасці, яго рэактар OO спосаб зрабіць неблокірующего ўводу/высновы, і Proactor з'яўляецца ОО спосаб зрабіць асінхроннага ўводу/высновы
  • ASIO з'яўляецца C + + I/O аснову, якая становіцца часткай Boost бібліятэкі. Гэта як ACE абнаўленне для эпохі STL.
  • libevent гэта лёгкі З I/O рамках Нільс Provos. Ён падтрымлівае kqueue і выбар, і неўзабаве будзе падтрымліваць апытання і epoll. Гэта ўзровень, спрацоўвае толькі, я думаю, што ёсць і добрыя і дрэнныя бакі. Нільс мае добры графік часу для апрацоўкі адной падзеі у залежнасці ад колькасці падлучэнняў. Гэта паказвае, kqueue і sys_epoll як пераможцы.
  • Мае ўласныя спробы ў лёгкім рамкі (нажаль, не абнаўляецца):
    • Поллер гэта лёгкі C + + I/O рамкі, якія рэалізуе ўзроўня спрацоўвае гатовасці API з выкарыстаннем любых асноўных гатовасці API вы жадаеце (апытанне, выбар, /dev/poll, kqueue, ці SIGIO). Гэта карысна для тэстаў, якія параўноўваюць прадукцыйнасць розных API. У гэтым дакуменце спасылкі на Поллер падкласы ніжэй, каб паказаць, як кожны з гатовасці API, могуць быць скарыстаны.
    • раён з'яўляецца лёгкі CI/O рамкі, якія былі маёй другой спробы пасля Поллер. Гэта LGPL (так прасцей для выкарыстання ў камерцыйных прыкладаннях) і З (так прасцей у выкарыстанні, не злучаных з C + + прыкладанняў). Яна была скарыстана ў некаторых камерцыйных прадуктаў.
  • Мэтт валійскі піша паперы у красавіку 2000 гады пра тое, як баланс выкарыстання працоўнага струменя і падзеямі метадаў пры стварэнні якія маштабуюцца сервераў. артыкул апісвае частку яго Sandstorm уводу/высновы базы.
  • Дакарай Нэльсана маштабу! Бібліятэка - асінхронны сокет, файл, і трубу бібліятэкі ўводу/высновы для Windows

I/O Стратэгіі

Дызайнеры сеткавага праграмнага забеспячэння ёсць шмат варыянтаў. Вось некаторыя з іх:
  • Лі і як пытанне некалькі I/O званкі з аднаго струменя
    • Не; выкарыстоўваць блакаванне/сінхронныя выклікі па ўсім, і, магчыма, выкарыстоўваць некалькі струменяў ці працэсаў для дасягнення паралелізму
    • Выкарыстоўвайце неблокірующіх выклікаў (напрыклад, напісаць () на сокет усталяваны ў O_NONBLOCK) для пачатку ўводу/высновы, і гатовасць апавяшчэння (напрыклад, апытанне () ці /dev/poll), каб ведаць, калі ён у парадку, каб пачаць наступны ўводу/высновы на гэтым канале. Наогул выкарыстоўвацца толькі з сеткавага ўводу-высновы, а не дыскавага ўводу/высновы
    • Выкарыстанне асінхронных выклікаў (напрыклад, aio_write ()) для пачатку ўводу/высновы, а таксама завяршэнне апавяшчэння (напрыклад, сігналы і порты завяршэння), каб ведаць, калі I/O аздабленні. Добра для сеткавага і дыскавага ўводу/высновы
  • Як кантраляваць код абслугоўванню кожнага кліента
    • адзін працэс для кожнага кліента (класічны падыход Unix, выкарыстоўваны з 1980 гады ці каля таго)
    • адзін на ўзроўні аперацыйнай сістэмы струмень ручкі шмат кліентаў, кожны кліент знаходзіцца пад кантролем:
      • на ўзроўні карыстача струменя (напрыклад, GNU станы тэмы, класічны Java з зялёным тэмы)
      • дзяржаўная машына (трохі эзатэрычным, але папулярная ў некаторых кругах, мой каханы)
      • працяг (трохі эзатэрычным, але папулярны ў вызначаных кругах)
    • адзін на ўзроўні аперацыйнай сістэмы струмень для кожнага кліента (напрыклад, класічны Java з уласнымі струменямі)
    • адзін на ўзроўні аперацыйнай сістэмы струмень для кожнага актыўнага кліента (напрыклад, Tomcat з Apache інтэрфейсу; порты NT завяршэнні; пулаў струменяў)
  • Ці варта выкарыстоўваць стандартныя O/S паслугі, ці пакласці некаторы код у ядро (напрыклад, у адмысловы драйвер, модуль ядра ці VxD)

Наступныя пяць камбінацый, здаецца, каб быць папулярным:

  • Падаваць шмат кліентаў з кожнага струменя, і выкарыстоўваць неблокірующего ўводу/высновы і узровень-спрацоўвае гатовасці апавяшчэння
  • Падаваць шмат кліентаў з кожнага струменя, і выкарыстоўваць неблокірующій увод/выснова і апавяшчэнні пра змене гатовасці
  • Падаваць шмат кліентаў з кожным серверам нітка, і выкарыстанне асінхроннага ўводу/высновы
  • служыць адзін кліент з кожным серверам нітка, і выкарыстанне блакавання ўводу/высновы
  • Зборка сервернага кода ў ядро

1. Падаваць шмат кліентаў з кожнага струменя, і выкарыстоўваць неблокірующего ўводу/высновы і узровень-спрацоўвае гатовасці апавяшчэння

... мноства неблокірующій рэжым на ўсіх сеткавых ручкі, і выкарыстанне абярыце () ці апытання (), каб сказаць, якія сеткі ручка дадзеныя чаканні. Гэта традыцыйная, каханая. З гэтай схемай, ядры ці кажа вам дэскрыптар файла гатовы, ці не Вы зрабілі што-небудзь з гэтым дэскрыптар файла з моманту апошняй ядры сказаў вам пра гэта. (Назва 'узроўнем сігналу "адбываецца ад кампутарнага праектавання апаратных, гэта супрацьлегласць "фронту". Джонатон Цытрына ўвяла тэрміны ў яго BSDCon 2000 дакумент па kqueue ().)

Нататка: гэта асабліва важна памятаць, што гатовасць апавяшчэнне ад ядра толькі намёк; дэскрыптар файла можа быць не гатовая больш, калі вы спрабуеце прачытаць з яго. Вось чаму важна выкарыстоўваць неблокірующій рэжым пры выкарыстанні гатовасці апавяшчэння.

Важна вузкім месцам у дадзеным метадзе з'яўляецца тое, што чытаць () ці Sendfile () з блокаў дыска, калі старонка не ў асноўнай на дадзены момант, усталяванне неблокірующій рэжым на дыску дэскрыптар файла не мае ніякага эфекту файлаў. Тое ж самае дакранаецца і памяці, дыска адлюстроўваецца. першы раз сервер павінен дыскавага ўводу/высновы, яго блокі працэс, усе кліенты павінны чакаць, і што сыравіна nonthreaded прадукцыйнасці ідзе ў адыходы.
Гэта тое, што асінхронны ўвод/выснова патрэбен, але ў сістэмах, адсутнасць AIO, працоўныя струмені і працэсы, якія дыскавага ўводу/высновы можна абыйсці гэта вузкае месца. Адзін падыход складаецца ў выкарыстанні памяці файлы, і калі mincore () паказвае ўводу/высновы неабходна, папытаеце працаўніка рабіць I/O, і працягваюць апрацоўку сеткавага трафіку. Джеф Poskanzer згадвае, што, Druschel, і Zwaenepoel у 1999 году Пай Flash вэб-сервер выкарыстоўвае гэты трук, яны далі казаць на Usenix 99 на яго, як. Падобна mincore () даступная ў BSD-вытворных АС Unix FreeBSD і Solaris, але не частка Single Unix Specification. Яна даступная як частка Linux у якасці ядра 2.3.51, дзякуючы Чак рычаг.

Але у лістападзе 2003 гады па-хакераў спісу FreeBSD, Вівек Пі і інш. паведамілі, вельмі добрыя вынікі, выкарыстоўваючы агульнасістэмныя прафіляванні іх вэб-сервер Flash пошасць на вузкіх месцаў. Адно вузкае месца яны выявілі, mincore (думаю, што была не такой добрай ідэяй, урэшце) Іншы быў той факт, што Sendfile блокаў на доступ да дыска, яны падвышэння прадукцыйнасці шляхам уводзін змененых Sendfile (), якія вяртаюць штосьці накшталт EWOULDBLOCK калі дыск старонкі гэта Выманне яшчэ не ў ядры. (Не ведаю, як вы кажаце карыстачу старонкі ў наш час які пражывае... мне здаецца, што сапраўды неабходна тут aio_sendfile ().) канчатковы вынік іх аптымізацыі з'яўляецца SpecWeb99 рахункам каля 800 на FreeBSD акно 1GHZ/1GB, што лепш, чым штосьці на файл на spec.org.

Ёсць некалькі спосабаў для аднаго струменя, каб сказаць, які са мноства неблокірующего разеткі гатовыя да I/O:

  • Традыцыйныя выбару ()
    Нажаль, выбару () абмежавана FD_SETSIZE ручкамі. Гэта мяжа складзены ў стандартнай бібліятэцы і карыстацкія праграмы. (Некаторыя версіі бібліятэкі C дазваляюць павялічыць гэта значэнне на карыстачоў прыкладання час кампіляцыі.)

    Гл. Poller_select ( гл, H ), на прыкладзе таго, як выкарыстоўваць выбару () нароўні з іншымі схемамі апавяшчэння гатовасці.

  • Традыцыйнае апытанне ()
    Існуе не цвёрда абмежаванні на колькасць дэскрыптараў файлаў апытання () можа працаваць, але гэта сапраўды становіцца павольным пра некалькі тысяч, бо большасць файлавых дэскрыптараў якія прастойваюць у любы момант часу, і сканаванне праз тысячы дэскрыптар файла займае шмат часу.

    Некаторыя аперацыйныя сістэмы (напрыклад, Solaris 8) паскорыць апытання () і інш. з выкарыстаннем такіх метадаў, як апытанне намякае, які быў рэалізаваны і пратэставаныя Нільс Provos для Linux у 1999 году.

    Гл. Poller_poll ( CC, ч, тэсты ), на прыкладзе таго, як выкарыстоўваць апытання () нароўні з іншымі схемамі апавяшчэння гатовасці.

  • /dev/poll
    Гэта рэкамендаваная замена апытанне для Solaris.

    Ідэя /dev/poll, каб скарыстацца тым, што часцяком апытання () выклікаецца шмат разоў з тымі ж аргументамі. З /dev/poll, вы атрымаеце адкрыты дэскрыптар /dev/poll, і сказаць OS толькі раз, якія файлы вы зацікаўлены ў па адрасе, што ручка; з тых часоў, вы толькі што прачыталі мноства цяперашні час гатовыя дэскрыптараў файлаў ад ручкі.

    Ён з'явіўся ціха ў Solaris 7 ( гл. patchid 106541 ), але яго першае публічнае з'яўленне было ў Solaris 8, у адпаведнасці з ВС, на 750 кліентаў, гэта 10% ад накладных выдаткаў апытання ().

    Розныя рэалізацыі /dev/poll былі асуджаны на Linux, але ніхто з іх так добра, як epoll, і ніколі не былі завершаны. /dev/poll па выкарыстанні Linux не рэкамендуецца.

    Гл. Poller_devpoll ( CC, ч крытэраў ), на прыкладзе таго, як выкарыстоўваць /dev/poll нароўні са шматлікімі іншымі схемамі апавяшчэння гатовасці. (Увага - прыклад для Linux /dev/poll, не можа працаваць прама на Solaris.)

  • kqueue ()
    Гэта рэкамендаваная замена апытанне для FreeBSD (і, хутчэй, NetBSD).

    Гл. ніжэй. kqueue () можна паказаць або краі ці запуску ўзроўня запуску.

2. Падаваць шмат кліентаў з кожнага струменя, і выкарыстоўваць неблокірующій увод/выснова і апавяшчэнні пра змене гатовасці

Гатовасць апавяшчэння пра змену (ці краі выклікала гатовасці апавяшчэння) азначае, што вы даць ядром дэскрыптар файла, а потым, калі што дэскрыптар пераходы з не гатовыя гатовы, ядро апавяшчае вас неяк. Затым ён мяркуе, што вы ведаеце дэскрыптар файла гатовы, і не будзе адпраўляць больш гатовасці апавяшчэння гэтага тыпу для гэтага дэскрыптар файла, пакуль вы робіце штосьці чыннікаў дэскрыптар файла, каб больш не быць гатовым (напрыклад, пакуль вы не атрымаеце памылку на EWOULDBLOCK Адпраўце Recv, ці прыняць выклік ці адправіць ці Recv пераклады менш, чым запытаная колькасць байт).

Пры выкарыстанні апавяшчэння пра змену гатовасць, вы павінны быць гатовыя да лжывых падзей, бо адна агульная рэалізацыя на сігнал гатовасці, калі ўсе пакеты будуць атрыманы, незалежна ад таго, дэскрыптар файла быў ужо гатовы.

Гэта супрацьлегласць " узроўня спрацоўвае "гатовасці апавяшчэння. Гэта трохі менш прабачаць праграмавання памылкі, бо калі вам бракуе літаральна адной падзеі, сувязі, што падзея была для захрасае назаўжды. Тым не менш, я выявіў, што край-спрацоўвае гатовасці апавяшчэнні, праграмаванне неблокірующего кліентаў з OpenSSL лягчэй, так што варта паспрабаваць.

[Банга, Mogul, Drusha 99] апісаў гэты выгляд схемы ў 1999 году.

Ёсць некалькі API, якія дазваляюць атрымаць прыкладанне "дэскрыптар файла стаў гатовыя" апавяшчэнняў:

  • kqueue () Гэта рэкамендуемы краі выклікала апытання замены для FreeBSD (і, хутчэй, NetBSD).

    FreeBSD 4.3 і вышэй, і NetBSD-па стане на кастрычнік 2002, падтрымка абагульненых альтэрнатыва апытання () завецца kqueue ()/kevent (), яна падтрымлівае абодва краі запуску і ўзроўня вабіць за сабой таксама. (Гл. Цытрыны старонкі Джонатан і яго BSDCon 2000 дакумент па kqueue ().)

    Як /dev/poll, вы вылучыць трансляцыя аб'екта, а, хутчэй, чым адкрыць файл /dev/poll, вы завяце kqueue (), каб вылучыць адзін. Для змены падзеі вы слухаеце для, ці атрымаць спіс бягучых падзей, вы завяце kevent () на дэскрыптар вяртаецца kqueue (). Яна можа слухаць не толькі для сокета гатовасці, але і для простых гатовасці файл, сігналаў, і нават для завяршэння ўводу/высновы.

    Нататка: па стане на кастрычнік 2000 гады, Threading бібліятэкі на FreeBSD не ўзаемадзейнічае таксама з kqueue (); відаць, калі kqueue () блокі, цэлыя кварталы працэс, а не толькі задзірлівы струмень.

    Гл. Poller_kqueue ( CC, ч, тэсты ), на прыкладзе таго, як выкарыстоўваць kqueue () нароўні са шматлікімі іншымі схемамі апавяшчэння гатовасці.

    Прыклады і бібліятэк, якія выкарыстоўваюць kqueue ():

    • PyKQueue - Python абавязковымі для kqueue ()
    • Guilmette напрыклад Рональд Ф. Echo Server, гл. таксама яго 28 верасня 2000 паведамленню FreeBSD.questions.
  • epoll
    Гэта рэкамендуемы краі выклікала апытання замены для ядра 2.6 Linux.

    11 ліпеня 2001 гады, Давыдзе Libenzi прапануецца альтэрнатыва ў рэальным часе сігналаў, яго патч забяспечвае тое, што ён зараз заве / Dev/epoll www.xmailserver.org/Linux-патчы/NiO-improve.html. Гэта гэтак жа, як у рэальным часе апавяшчэння гатовасці сігналу, але ён зліваецца залішніх падзей, і больш эфектыўная схема для масавага вымання падзей.

    Epoll быў аб'яднаны з 2,5 дрэва ядра ад 2.5.46 пасля яго інтэрфейс быў зменены з адмысловы файл у/Dev у сістэмны выклік, sys_epoll. Патч для старых версій epoll даступная для ядра 2.4.

    Існаваў працяглай дыскусіі о аб'яднаўчай epoll, AIO, і іншых крыніц падзей на ядры спісе рассылання Linux вакол Хэллоуіна 2002 гады. Ён яшчэ можа здарыцца, але Davide канцэнтруецца на ўмацавальны да epoll у цэлым у першую чаргу.

  • Полякова kevent (Linux 2.6 +) Навіны Flash: 9 фев 2006, і зноў ад 9 ліпеня 2006 гады, Яўген Палякаў змесцаваны патчы, якія, здаецца, аб'яднаць epoll і шматфункцыянальная прылада, яго мэта складаецца ў падтрымцы сеткі AIO. Гл.:
    • Артыкул LWN о kevent
    • яго ліпені аб'явы
    • яго kevent старонкі
    • яго NAIO старонкі
    • некаторыя нядаўнія абмеркаванні
  • Drepper новага сеткавага інтэрфейсу (прапанова для Linux 2.6 +)
    У МНК 2006 гады, Ульрых Drepper прапанаваных новых высакахуткасных сетак асінхронных API Пасаду.:
  • Сігналы рэальнага часу
    Гэта рэкамендуемы краі выклікала апытання замены для ядра 2.4 Linux.

    2,4 ядры Linux можа забяспечыць гатовасць падзей электрасілкавання праз вызначаны сігнал у рэальным часе на. Вось як ператварыць гэтыя паводзіны:

     
    /* Mask off SIGIO and the signal you want to use. */
    sigemptyset(&sigset);
    sigaddset(&sigset, signum);
    sigaddset(&sigset, SIGIO);
    sigprocmask(SIG_BLOCK, &m_sigset, NULL);
    /* For each file descriptor, invoke F_SETOWN, F_SETSIG, and set O_ASYNC. */
    fcntl(fd, F_SETOWN, (int) getpid());
    fcntl(fd, F_SETSIG, signum);
    flags = fcntl(fd, F_GETFL);
    flags |= O_NONBLOCK|O_ASYNC;
    fcntl(fd, F_SETFL, flags);
    
    Гэта пасылае сігнал, што пры звычайнай функцыі ўводу/высновы, як чытаць () ці напісаць () завяршаецца. Каб выкарыстоўваць гэта, напісаць звычайнае апытанне () вонкавага цыклу, і ўсярэдзіне яе, пасля таго як вы зладзіліся з усімі FD заўважыў апытальным шляхам ( ), вы завесы выкліку sigwaitinfo ().
    Калі sigwaitinfo ці sigtimedwait вяртае ваш сігнал у рэальным часе, siginfo.si_fd і siginfo.si_band даюць амаль тую ж інфармацыю, pollfd.fd і pollfd.revents бы пасля выкліку для апытання (), так што вы ручка ўводу/высновы, і працягваць выкліку sigwaitinfo ().
    Калі sigwaitinfo вяртае традыцыйныя SIGIO, сігнал чаргі перапоўнены, так што вы флэш сігнал чаргі, часова змяняецца апрацоўнік сігналу для SIG_DFL, і перапынку вярнуцца да вонкавых апытання () цыкл.

    Гл. Poller_sigio ( гл, H ), на прыкладзе таго, як выкарыстоўваць rtsignals нароўні са шматлікімі іншымі схемамі апавяшчэння гатовасці.

    Гл. Зак Браун phhttpd напрыклад код, які выкарыстоўвае гэту функцыю напроста. (Ці не; phhttpd гэта трохі цяжка зразумець...)

    [ Provos, рычаг, і Твіді 2000 ] апісвае апошнія эталонам phhttpd выкарыстаннем варыянт sigtimedwait (), sigtimedwait4 (), што дазваляе атрымаць некалькі сігналаў з дапамогай аднаго выкліку. Цікава, што галоўны балазе sigtimedwait4 () для іх, здавалася, яна дазволіла прыкладанне для адзнакі сістэмы перагрузкі (так ён можа паводзіць сябе належным ). (Адзначым, што апытанне () забяспечвае такую ж меру перагрузкі сістэмы.)

  • Сігнал за FD
    Чандра і Mosberger прапанаваныя змены ў рэальным часе сігнал падыход завецца "сігнал-у-ФД", які памяншае ці ўхіляе рэальным часе перапаўнення чаргі сігналу якія зліваюцца залішніх падзей. Гэта не перасягнуць epoll, аднак. Іх артыкул ( www.hpl.hp.com/techreports/2000/HPL-2000-174.html ) паказана, як вынікі гэтай схемы з выбару () і /dev/poll.

    Віталь Любань абвясціў патч рэалізацыі гэтай схемы 18 траўня 2001 гады, яго жыццё патч на www.luban.org/GPL/gpl.html нагрузкі. (Нататка: на верасень 2001 гады, могуць па-ранейшаму праблемы са стабільнасцю пры гэтым патч пад цяжкім. dkftpbench на каля 4500 карыстачоў могуць выклікаць шкадаванню.)

    Гл. Poller_sigfd ( гл, H ), на прыкладзе таго, як выкарыстоўваць сігнал за FD нароўні са шматлікімі іншымі схемамі апавяшчэння гатовасці.

3. Падаваць шмат кліентаў з кожным серверам нітка, і выкарыстанне асінхроннага ўводу/высновы

Гэта яшчэ не стала папулярнай у Unix, верагодна, таму што некалькі аперацыйных сістэм падтрымку асінхроннага ўводу-высновы, таксама, магчыма, таму што (як неблокірующій I/O) патрабуе пераасэнсавання вашага прыкладання. У стандартных Unix, асінхроннага ўводу/высновы ажыццяўляецца aio_ інтэрфейс (пракруціце ўніз ад, якія спасылаюцца на "асінхронны ўваход і выйсце"), які злучае сігнал і значэнне кожнай аперацыі ўводу/высновы. сігналах і іх значэнні ў чаргу і дастаўляюцца эфектыўна карыстацкага працэсу. Гэта з POSIX 1003.1b рэальным часе пашырэнняў, а таксама ў Single Unix Specification, версія 2.

AIO звычайна выкарыстоўваецца з краю выклікала завяршэнні апавяшчэння, г.зн. сігнал чаргі, калі аперацыя завершана. (Ён можа таксама выкарыстоўвацца з узроўнем сігналу завяршэння апавяшчэнне па тэлефоне aio_suspend (), хоць я падазраю, мала хто гэта зрабіць.)

Glibc 2.1 і пазней забяспечваюць агульны ажыццяўленні напісана для адпаведнасці стандартам, а не прадукцыйнасці.

LaHaise у ажыццяўленні Бэн для Linux AIO быў аб'яднаны з асноўным ядром Linux ад 2.5.32. Ён не выкарыстоўвае ядро тэмы, і вельмі эфектыўны асноўных API, але (па стане на 2.6.0-test2) пакуль не падтрымлівае сокеты. (Існуе таксама патч AIO для ядра 2.4, але 2.5/2.6 рэалізацыі некалькі іншая.) Дадатковая інфармацыя:

  • Старонка " Ядро асінхроннага ўводу/высновы (AIO) Падтрымка Linux ", які спрабуе звязаць разам усю інфармацыю о 2,6 ядры рэалізацыі з AIO (Дададзена 16 верасня 2003)
  • 3 этап: AIO VS/Dev/epoll Бенджаміна CR LaHaise (прадстаўлены ў 2002 МНК)
  • Асінхроннага ўводу/высновы Suport у Linux 2.5, па Bhattacharya, Пратт, Pulaverty, і Морган, IBM, прадстаўленых на МНК '2003
  • Дызайн Нататкі пра асінхроннага ўводу/высновы (AIO) для Linux ад Suparna Bhattacharya - параўноўвае's AIO Бэн з's KAIO SGI і некалькі іншых праектаў AIO
  • Linux AIO Галоўная старонка - Бэна папярэдняй патчы, спіс рассылання і г.д.
  • Linux-AIO архівы спісаў рассылання
  • libaio-аракул - бібліятэка, якая рэалізуе стандарт Posix AIO на вяршыні libaio. Упершыню згадваецца Джоэл Бекер на 18 красавіка 2003.
Suparna таксама мяркуе, якія маюць выгляд на ДАФС API падыход да AIO.

Red Hat AS і SUSE SLES і забяспечваюць высокую прадукцыйнасць рэалізацыі на ядры 2.4, гэта злучана, але не цалкам ідэнтычныя, 2,6 рэалізацыі ядра.

У лютым 2006 гады, новая спроба да таго, каб забяспечыць сетку AIO, гл. нататка вышэй пра аснову AIO Яўгенія Полякова kevent.

У 1999 году SGI рэалізаваны высакахуткасная шматфункцыянальная прылада для Linux. Пачынальна з версіі 1.1, ён сказаў, каб добра працаваць як з дыскавага ўводу/высновы і разеткі. Ён, здаецца, выкарыстоўвае ядро тэмы. Гэта яшчэ карысна для людзей, якія не могуць чакаць у AIO Бэн падтрымлівае сокеты.

O'Reilly кнігі POSIX.4: Праграмаванне для рэальнага свету завецца ўключаюць добрыя ўводзіны ў AIO.

Падручнік для раней, нестандартныя, AIO рэалізацыі на Solaris з'яўляецца ў Інтэрнэце па адрасе Sunsite. Гэта, верагодна, варта паглядзець, але майце на ўвазе, вы павінны будзеце ўяўна пераўтварыць "aioread" да "aio_read" і г.д.

Звернеце ўвагу, што шматфункцыянальная прылада не забяспечвае шлях для адкрыцця файлаў без блакавання для аперацый уводу/высновы, калі вы клапоціцеся пра сну выклікана адкрыцці файла на дыску, Лінус прапануе Вам варта проста Open () у іншым струмені, а не ахвотнікаў для aio_open () сістэмных выклікаў.

Пад Windows, асінхронны ўвод/выснова злучаны з тэрмінамі "які перакрываецца I/O" і IOCP ці "I/O порт завяршэння".'s IOCP Microsoft спалучае ў сабе прыёмы з узроўня тэхнікі, як асінхронны ўвод/выснова (як aio_write) і ў чэргі завяршэння апавяшчэння (напрыклад, пры выкарыстанні aio_sigevent поле з aio_write) з новай ідэяй правядзення назад некаторыя запыты, каб паспрабаваць захаваць колькасць запушчаных струменяў, злучаных з адной IOCP сталай. Для атрымання дадатковай інфармацыі гл. Усярэдзіне I/O порты завяршэння Марк Руссіновіч на sysinternals.com, Рыхтар кніга Джэфры "Праграмаванне серверных прыкладанняў для Microsoft Windows 2000" ( Amazon, MSPress ), ЗША патэнт № 06223207, ці MSDN.

4. Падаваць аднаго кліента з кожнага струменя сервера

... а чытаць () і Write () блок. З недахопам выкарыстання ўвесь стэк для кожнага кліента, які варта памяці. Шматлікія АС таксама маюць праблемы з апрацоўкай больш за некалькі сотняў тэмы. Калі кожны струмень атрымае 2 Мб стэка (не незвычайным значэнне па змаўчанні), вы бежыце з * віртуальны * памяці (2 ^ 30/2 ^ 21) = 512 нітак на 32-бітныя машыны з 1 ГБ даступнай карыстачу В. М. (напрыклад, скажам, Linux, як звычайна пастаўляюцца на x86). Вы можаце абыйсці гэта, даючы кожнаму струменю менш стэка, але бо большасць бібліятэк струмень не дазваляюць выгадоўваць стэкаў струменяў пасля стварэння, робяць гэта азначае, распрацоўцы праграмы па мінімізацыі выкарыстання стэка. Вы таксама можаце абыйсці гэта, пераход да 64-бітны працэсар.

Падтрымка струменяў у Linux, FreeBSD, Solaris і паляпшаецца, і 64-разрадныя працэсары проста за кутом нават для звычайных карыстачоў. Магчыма, у не гэтак аддаленай будучыні, тыя, хто аддаюць перавагу выкарыстоўваць па адным струмені на кліента будзе ў стане выкарыстоўваць што парадыгма нават на 10000 кліентаў. Тым не менш, у наш час, калі вы сапраўды жадаеце падтрымліваць, што шматлікія кліенты, вы, верагодна, лепш выкарыстоўваць іншай парадыгме.

Для спакойна-нітка пункта гледжання прафесіянала, гл. Чаму падзеі дрэнная ідэя (для высокага паралелізму сервераў) фон Behren, Кондіт, і Брюер, UCB, прадстаўленыя на HotOS IX. Любай са струменя лагер сыходу барацьбе адзначыць, паперы, аспрэчвае гэта?:-)

LinuxThreads

LinuxTheads гэта імя для стандартнай бібліятэкі струменяў Linux. Яна інтэгравана ў Glibc з glibc2.0, і галоўным чынам POSIX-сумяшчальных, але з меней зорным прадукцыйнасці і сігнал падтрымкі.

NGPT: Наступнае пакаленне Posix Тэмы для Linux

NGPT з'яўляецца праект ад IBM, каб прынесці добрыя POSIX-сумяшчальных струменяў падтрымку Linux. Гэта ў стабільнай версіі 2.2 зараз, і працуе добра... але каманда NGPT мае абвясцілі, што яны ставяць NGPT кодзе ў падтрымку рэжыме "толькі таму, што яны адчуваюць, што гэта" лепшы спосаб падтрымкі супольнасці на доўгатэрміновую перспектыву ". Каманда NGPT будзе працягваць працу па паляпшэнні Linux падтрымка струменяў, але зараз засяроджаны на паляпшэнні NPTL. (Слава да каманды NGPT за іх добрую працу і вытанчаны спосаб, якім яны саступілі NPTL.)

NPTL: Родныя бібліятэкі струменяў Posix для Linux

NPTL з'яўляецца праект Ульрых Drepper (добразычлівы DICT ^ H ^ H ^ H ^ Hmaintainer з Glibc ) і Инго Молнар давесці сусветнага класа Posix Threading падтрымку Linux.

Па стане на 5 кастрычніка 2003 гады, NPTL зараз аб'яднаны ў Glibc дрэва CVS у якасці дадатку каталога (як LinuxThreads), таму ён амаль напэўна будзе выпушчаны разам з наступнай версіі Glibc.

Першы буйны размеркаванні ўключыць ранняга здымак NPTL быў Red Hat 9. (Гэта было трохі нязручна для некаторых карыстачоў, але хтосьці, каб зламаць лёд...)

NPTL спасылкі:

  • Спіс рассылання для абмеркавання NPTL
  • NPTL зыходны код
  • Першапачатковая аб'ява для NPTL
  • Арыгінальны афіцыйны дакумент апісвальны мэты NPTL
  • Перагледжаны афіцыйны дакумент апісвальны канчатковы праект NPTL
  • Инго Молнар у першым цесце паказваць яго можа апрацоўваць 10 ^ 6 тэмы
  • у цесце Ўльрых параўнанні прадукцыйнасці LinuxThreads, NPTL, і IBM, NGPT. Здаецца, каб паказаць NPTL значна хутчэй, чым NGPT.
Вось мый паспрабаваць у апісанні гісторыі NPTL (гл. таксама Куперстейн у артыкуле Джэры ):

У сакавіку 2002 гады, Біл Abt з каманды NGPT, Glibc Суправаджалы Ўльрых Drepper, і іншыя сустрэліся, каб высвятліць, што рабіць з LinuxThreads;. Адна з ідэй, якія выйшлі з паседжання было паляпшэнне прадукцыйнасці мутэкс Гадуй Рассел і інш. пасля рэалізаваны хутка карыстацкай прасторы мутэксы (futexes) ), якія ў наш час выкарыстоўваецца як NGPT і NPTL. Большасць чал зразумеў NGPT павінны быць аб'яднаны ў Glibc.

Ульрых Drepper, аднак, не спадабалася NGPT, і меркаваў, што ён мог зрабіць лепш. (Для тых, хто калі-небудзь спрабавалі спрыяць патч для Glibc, гэта не можа прыйсці, як вялікая неспадзеўка:-) На працягу наступных некалькіх месяцаў, Ульрых Drepper, Инго Молнар, і іншыя спрыялі Glibc і ядры змены, якія складаюць так званы Родныя POSIX Threads Library (NPTL). NPTL выкарыстоўвае ўсе ядры ўдасканаленняў прызначаны для NGPT, і выкарыстоўвае некалькі новых. Инго Молнар апісаныядро паляпшэнняў наступным чынам:

Хоць NPTL выкарыстоўвае тры ядры магчымасцяў, прадстаўленых на NGPT: GETPID () вяртае PID, CLONE_THREAD і futexes; NPTL таксама выкарыстоўвае (і выкарыстоўвае) значна шырэйшы набор новых функцый ядра, распрацаваныя ў рамках гэтага праекта.

Некаторыя з пунктаў NGPT уведзены ў ядро вакол 2.5.8 атрымаў змену, ачыстцы і пашыраны, такіх, як групы струменяў апрацоўкі (CLONE_THREAD). [CLONE_THREAD змены, уздзеянне на сумяшчальнасць NGPT атрымаў сінхранізаваны з NGPT людзей, каб пераканацца, што NGPT не ломіцца ў любы непрымальны шлях.]

Ядро функцыі, распрацаваныя для і выкарыстоўваецца NPTL апісаны ў дызайн Тэхнічнае апісанне, http://people.redhat.com/drepper/nptl-design.pdf...

Кароткі спіс: TLS падтрымкі розных клонаў пашырэнняў (CLONE_SETTLS, CLONE_SETTID, CLONE_CLEARTID), POSIX-струменяў апрацоўкі сігналаў, sys_exit () пашырэнне (рэліз TID futex на ВМ-рэліз), sys_exit_group () сістэмны выклік, sys_execve () удасканаленні і падтрымкі для асобных струменяў.

Быў таксама ўведзены ў працу пашырэння прасторы PID - напрыклад,. PROCFS разбіўся з-за 64 PID здагадкі, max_pid, і PID працы маштабаванасць размеркавання. Plus лік прадукцыйнасці толькі для паляпшэння былі зроблены, а таксама.

У сутнасці новых функцый не-кампрамісаў падыход да 1:1 Threading - ядро зараз дапамагае ва ўсім, дзе ён можа палепшыць Threading, і мы сапраўды рабіць мінімальна неабходны набор кантэкстных пераключэнняў і выклікаў ядра для кожнага асноўных струменяў прымітыўна.

Адно вялікае адрозненне паміж імі складаецца ў тым NPTL з'яўляецца ў прапорцыі 1:1 струменевая мадэль, у той час як NGPT з'яўляецца М: струменевая мадэль N (гл. ніжэй). Нягледзячы на гэта, Ульрых першапачатковыя тэсты, здаецца, паказваюць, што NPTL сапраўды нашмат хутчэй, чым NGPT. (Каманда NGPT з нецярпеннем чакае сустрэчы тэсце код Ульрыха праверыць вынік.)

FreeBSD падтрымку струменяў

FreeBSD падтрымлівае як LinuxThreads і карыстацкіх струменяў бібліятэка. Акрамя таго, М Н ажыццяўлення завецца KSE быў уведзены ў FreeBSD 5,0 гл.. За адзін агляд, www.unobvious.com/BSD/FreeBSD-threads.html.

Сакавік 25 2003, Джефф Роберсон змесцаваны на FreeBSD-аркі:

... Дзякуючы Фонд падаў Джуліан, Дэвід Сюй, Міні, Дэн Eischen, і ўсе астатнія, хто браў удзел з KSE і libpthread развіцці Міні і я распрацаваў у прапорцыі 1:1 рэалізацыі шматструменнасці. Гэты код працуе паралельна з KSE і не парушае яго ў любым выпадку. Гэта сапраўды дапамагае прывесці M: N Threading бліжэй да тэставання з агульных біт....
А ў ліпені 2006 гады Роберт Уотсан прапанаваў 1:01 ажыццяўленні Threading стаць змаўчанню Ў FreeBSD 7.x:
Я ведаю, што гэта быў абмеркаваны і ў мінулым, але я меркаваў, з 7.x каціў наперад, надышоў час думаць пра гэта зноў. У арыенцірам для шматлікіх распаўсюджаных прыкладанняў і сцэнараў, libthr дэманструе значна лепшую прадукцыйнасць у параўнанні з libpthread... libthr таксама рэалізуецца праз большы лік нашых платформаў, і ўжо libpthread на некалькіх. Першая рэкамендацыя мы робім для MySQL і іншых цяжкіх карыстачоў струмень "Пераключыць на libthr", які наводзіць на думку, таксама!... Так Строман прапанова: зрабіць libthr змаўчанню Threading бібліятэкі на 7.x.

NetBSD падтрымку струменяў

У адпаведнасці з цыдулкай ад Норіюкі соды:
Ядро падтрымлівае M: N бібліятэкі струменяў на аснове мадэлі актывацый планоўшчык аб'яднаны ў NetBSD-току ад 18 студзеня 2003.
Дадатковыя звесткі гл. у частцы Рэалізацыя планоўшчыка актывацый на NetBSD Аперацыйная сістэма Натана Дж. Уільямс, Wasabi Systems, Inc, прадстаўленыя на FREENIX '02.

Solaris падтрымку струменяў

Падтрымка струменяў у Solaris развіваецца... Solaris ад 2 да Solaris 8, па змаўчанні Threading бібліятэка, выкарыстоўваная M: N мадэлі, але Solaris 9 па змаўчанні да 1:1 падтрымка струменяў мадэлі Пасаду. шматструменнага праграмавання Sun, кіраўніцтва і адзначым ВС о Java і Solaris Threading.

Java падтрымку струменяў у JDK 1.3.x і больш раннія версіі

Як вядома, Java да JDK1.3.x не падтрымлівае любы метад апрацоўкі сеткавых злучэнняў, не па адным струмені на кліента. Volanomark з'яўляецца добрым мікротестом які вымярае прапускную здольнасць у messsages у секунду пры розных лікі адначасовых злучэнняў. Па стане на травень 2003 гады, JDK 1.3 рашэнні ад розных пастаўшчыкоў насамрэч у стане зладзіцца дзесяць тысяч адначасовых злучэнняў - хоць і са значнай дэградацыі прадукцыйнасці. Гл. Табліца 4 за ідэя якой віртуальныя машыны могуць апрацоўваць 10000 злучэнняў, і як прадукцыйнасць пакутуе як колькасць падлучэнняў павялічваецца.

Нататка: 1:1 разьбы ў параўнанні з M: N Threading

Існуе выбар пры ажыццяўленні Threading бібліятэка: вы можаце пакласці ўсё Threading падтрымку ў ядро (гэта завецца мадэлі 1:1 Threading), ці вы можаце перамясціць справядлівы біт яго ў карыстацкай прасторы (гэта завецца M: N струменевая мадэль). У адзін момант, M: N лічылі больш высокую прадукцыйнасць, але гэта настолькі складаны, што цяжка атрымаць правы, і большасць людзей сыходзяць з яе.
  • Чаму Инго Молнар аддае перавагу 1:01 па M: N
  • Сонца рухомай да 1:1 тэмы
  • NGPT з'яўляецца M: N Threading бібліятэку для Linux.
  • Хоць Ульрых Drepper плануецца выкарыстоўваць M: N Тэмы новая бібліятэка Threading бібліятэкі, з тых часоў ён пераключыўся на мадэлі 1:1 Threading.
  • MacOSX уяўляецца выкарыстанне 1:01 Threading.
  • FreeBSD і NetBSD па ўсёй бачнасці, усё яшчэ вераць у M: N струменяў... Самотны нязгодных? Падобна, FreeBSD 7.0 можа перамыкацца да 1:1 Threading (гл. вышэй), таму, магчыма, М: разьбы па вернікаў N, нарэшце, апынуліся няправыя ва ўсім свеце.

5. Зборка сервернага кода ў ядро

Novell і Microsoft з'яўляюцца як кажуць, зрабіў гэта ў розны час, прынамсі аднаго NFS ажыццяўленні робіць гэта, khttpd робіць гэта для Linux і статычныя вэб-старонкі, і "Tux" (з падтрымкай струменяў Linux вэб-сервер) з'яўляецца асляпляльна хуткае і гнуткае ядро-прастора HTTP-сервер, Инго Молнар для Linux. Инго 1 верасня 2000 аб'явы кажа альфа-версію TUX могуць быць запампаваны з ftp://ftp.redhat.com/pub/redhat/tux, і тлумачыць, як далучыцца да спісу рассылання для атрымання дадатковай Інфармацыя.
Linux-ядро спіс абмяркоўваюць плюсы і мінусы такога падыходу, і кансенсус, здаецца, замест перасоўвання вэб-сервераў у ядро, ядро павінна мець найменшае магчымае гаплікі дададзены для паляпшэння прадукцыйнасці сервера вэб. Такім чынам, іншыя выгляды серверы могуць скарыстацца. Гл., напрыклад, Браун заўвагі Зак пра карыстацкія супраць HTTP серверы ядра. Уяўляецца, што 2,4 ядры Linux забяспечвае дастатковую магутнасць для карыстацкіх праграм, як X15 сервер працуе прыкладна гэтак жа хутка, як Tux, але не выкарыстоўвае ніякіх змен у ядры.

Каментары

Рычард Гуч напісаў паперу абмеркаванні ўводу/высновы.

У 2001 году Тім Брехта і MMichal Астроўскага вымярэнні розных стратэгій для простага выбару сервераў на базе. Іх дадзеныя, варта паглядзець.

У 2003 году Тім Брехта змесцаваны зыходныя коды для userver, невялікі вэб-сервер сабраў з некалькіх сервераў, напісаны Абхішек Чандра, Дэвід Mosberger, Дэвід Pariag, і Міхал Астроўскага. Ён можа выкарыстоўваць выбару (), апытанне (), epoll (), ці SIGIO.

Яшчэ ў сакавіку 1999 гады, Дын Годет Дададзена:

Я ўвесь час атрымліваю спытаў: "Чаму не вы, дзеці, выкарыстанне абярыце/Мадэль заснаваная на падзеях, як Зеўс? Гэта відавочна хутчэй"...
Яго чыннікі зводзіліся да "Гэта вельмі цяжка, і выйгрыш не ясна". На працягу некалькіх месяцаў, аднак, стала ясна, што людзі былі гатовыя працаваць на ім.

Марк Руссіновіч піша рэдакцыйныя і артыкулы абмеркаванні I/O пытанням стратэгіі ў 2,2 ядры Linux. Варта прачытаць, нават ён, здаецца, дэзінфармавалі па некаторых пунктах. У прыватнасці, ён, здаецца, думаюць, што Linux 2.2 асінхроннага ўводу-высновы (гл. F_SETSIG вышэй) не апавяшчае карыстачоў працэсу, калі дадзеныя гатовыя, толькі тады, калі прыходзяць новыя злучэнні. Гэта здаецца дзіўным непаразуменнем. Гл. таксама заўвагі па папярэднім праекце, Молнара аспрэчанне Инго ад 30 красавіка 1999, Руссіновіча заўвагі 2 траўня 1999, аспрэчанне ад Алана Коксу, а таксама розныя паведамленні для Linux-ядры. Я падазраю, што ён спрабаваў сказаць, што Linux не падтрымлівае асінхронныя дыскавага ўводу/высновы, якія выкарыстоўваліся, каб быць праўдай, але зараз, SGI ажыццявіла KAIO, гэта не так усюды.

Пагледзіце на гэтых старонках у sysinternals.com і MSDN для атрымання інфармацыі пра "завяршэнне портаў", які па яго словах, унікальны для NT, у двух словах, Win32 у "перакрываюцца I/O" апынуўся занізкім узроўні, каб быць зручным, і " завяршэнне порт "з'яўляецца абалонкай, якая забяспечвае чэргі завяршэння падзей, а таксама планаванне магію, якая спрабуе захаваць лік запушчаных струменяў сталай, дазваляючы некалькі струменяў, каб забраць завяршэнні падзей, калі іншыя тэмы, якія ўзяў завяршэнні падзеі з гэтага порта спяць (магчыма, робіць блакаванне I/O).

Гл. таксама з падтрымкай OS/400 для I/O портамі завяршэння.

Там быль цікавая дыскусія на Linux-ядро ў верасні 1999 гады пад назвай " > 15 000 адначасовых падлучэнняў "(і другога тыдня струменя) Highlights.:

  • Эд зале змесцаваны некалькі нататак пра свой досвед, ён дасягнуць> 1000 злучае ў секунду на UP P2/333 працуе Solaris. Яго код, выкарыстоўваны невялікі пул струменяў (1 ці 2 на кожны працэсар) кожная кіравальная вялікая колькасць кліентаў, якія выкарыстоўваюць, "заснаванай на падзеях мадэлі".
  • Майк Jagdis змесцаваны аналіз апытання/абраць накладныя выдаткі, і сказаў: "бягучага выбару/апытанне рэалізацыя можа быць істотна палепшаны, асабліва ў выпадку блакавання, але накладныя выдаткі будуць па-ранейшаму павялічваецца з павелічэннем ліку дэскрыптараў таму што выбару/апытанне не робіць, і не можа, памятаеце, што дэскрыптары цікава. Гэта было б лёгка выправіць з новым API. Прапановы вітаюцца..."
  • Майк Дададзена пра яго працы па паляпшэнні абярыце () і апытанне ().
  • Майк Дададзена трохі пра магчымыя API для замены апытання ()/Select (): "Як наконт" прылады, як API, дзе вы пішаце "pollfd як" структуры, "прылада" праслухоўвае падзеі і пастаўляе "pollfd як" структуры ўяўляючы іх, калі вы чытаеце гэта?..."
  • Rogier Вольф прапанаваў з дапамогай "API, што лічбавы хлопцаў прапанаваў", http://www.cs.rice.edu/ ~ gaurav/papers/usenix99.ps
  • Йорг Pommnitz адзначыў, што любыя новыя API у гэтым кірунку павінны быць у стане чакаць не толькі дэскрыптар файла падзей, а таксама сігналаў і, магчыма, SYSV-МПК. Нашы прымітываў сінхранізацыі безумоўна, павінны быць у стане рабіць тое, што WaitForMultipleObjects Win32 можа, прынамсі.
  • Стывен Твіді сцвярджаў, што спалучэнне F_SETSIG, чэргі ў рэальным часе сігналаў, і sigwaitinfo () быў пашыраны API, прапанаваны ў http://www.cs.rice.edu/ ~ gaurav/papers/usenix99.ps. Ён таксама згадвае, што вы трымаеце сігнал заблакаваны ў любы час, калі вы зацікаўлены ў прадукцыйнасці, замест сігналу дастаўляюцца асінхронна, працэс захоплівае наступны з чаргі з sigwaitinfo ().
  • Джэйсан Nordwick параўнанню порты завяршэння з F_SETSIG сінхроннай мадэлі падзей, і прыйшла да высновы што яны вельмі падобныя.
  • Алан Кокс адзначыла, што старэй Rev з SIGIO патч ПКТЗ уключаны ў 2.3.18ac.
  • Іярданія Мендэльсон змесцаваны прыклад кода, які паказвае, як выкарыстоўваць F_SETSIG.
  • Стывен С. Твіді працягвае параўнанне порты завяршэння і F_SETSIG, і адзначыў: "З сігналу dequeuing механізм, ваша прыкладанне будзе атрымліваць сігналы, прызначаныя для розных кампанентаў бібліятэкі, калі бібліятэкі выкарыстоўваецца той жа механізм", але бібліятэка можа стварыць свой уласны апрацоўнік сігналу, так што гэта не павінна ўплываць на праграмы (шмат).
  • Дуг Ройер адзначыў, што ён атрымаў 100000 злучэнняў на Solaris 2.6, калі ён працаваў на серверы календару ВС Іншыя падхапіў з адзнакамі, колькі аператыўнай памяці, што запатрабуецца на Linux, і якія вузкія месцы будзе хітом.

Цікавае чытанне!

Абмежаванні на адкрытым маніпулятараў

  • Любая Unix: межы, усталяваныя ULIMIT ці setrlimit.
  • Solaris: гл. Solaris FAQ, пытанне 3,46 (ці каля таго, яны пранумараваць пытанні перыядычна).
  • FreeBSD:

    Рэдагаваць /boot/loader.conf, дадайце радок
    set kern.maxfiles=XXXX
    дзе XXXX з'яўляецца жаданай сістэмы абмежаванняў на файлавых дэскрыптараў, і перазагрузіце кампутар. Дзякуючы ананімным чытачом, які напісаў, каб сказаць, што ён дасягнуць значна больш, чым 10000 злучэнняў на FreeBSD 4.3, і кажа:
    "FWIW: Вы не можаце насамрэч наладзіць максімальную колькасць злучэнняў у FreeBSD трывіяльна, праз Sysctl... Вы павінны зрабіць гэта ў /boot/loader.conf.
    Чыннікам гэтага з'яўляецца тое, што zalloci () выклікае для ініцыялізацыі разеткі і tcpcb структуры зон адбываецца ў самым пачатку загрузкі сістэмы, з тым, што зона быць як тыпу стабільным і што гэта будзе замена.
    Вы таксама павінны ўсталяваць лік mbufs значна вышэй, бо вы будзеце (на неізмененной ядро) жаваць адну MBUF за злучэнне для tcptempl структур, якія выкарыстоўваюцца для рэалізацыі "заставайся ў жывых".
    Іншы чытач кажа
    "Па стане на FreeBSD 4.4, tcptempl структуры больш не вылучаецца, вам больш не прыйдзецца турбавацца пра аднаго MBUF час жаваў да кожнага злучэння."
    Гл. таксама:
    • Кіраўніцтва FreeBSD
    • Sysctl TUNING, ПАГРУЗЧЫК параметраў налады і канфігурацыі ядра TUNING у "чалавек налады"
    • Уздзеянне наладзе FreeBSD 4.3 Скрынка для высокай эфектыўнасці, Daemon News, жнівень 2001
    • postfix.org налады адзначае, які ахоплівае FreeBSD 4,2 і 4,4
    • Вымярэнне's Factory адзначае, каля FreeBSD 4.3
  • OpenBSD: чытач кажа
    "У OpenBSD, дадатковыя налады, для павелічэння ліку адкрытых маніпулятараў наяўныя ў працэс: openfiles-CUR параметр у / і г.д. /login.conf павінна быць павялічана ў. Вы можаце змяніць kern.maxfiles або з Sysctl-W ці sysctl.conf але гэта не мае ніякага эфекту. Гэта важна, таму што, як пастаўлены, межы login.conf з'яўляюцца даволі нізкі 64 для непрівілегірованный працэсаў, 128 для прывілеяваных".
  • Linux: гл. Бауэра/Бода Працы дакументацыі ядры. На 2,4:
    echo 32768 > /proc/sys/fs/file-max
    павялічваецца сістэмы абмежавання на адкрытыя файлы, і
    ULIMIT-N 32768 
    павелічэнне лімітаў бягучага працэсу.

    На 2.2.x ядры,

    echo 32768 > /proc/sys/fs/file-max
    echo 65536 > /proc/sys/fs/inode-max
    
    павялічваецца сістэмы абмежавання на адкрытыя файлы, і
    ULIMIT-N 32768 
    павелічэнне лімітаў бягучага працэсу.

    Я пераканалася, што працэс на Red Hat 6.0 (2.2.5 ці каля таго плюс патчы) можна адкрыць прынамсі 31000 дэскрыптараў файлаў такім чынам. Іншы чалавек пацвердзіў, што працэс на 2.2.12 можна адкрыць прынамсі 90000 дэскрыптараў файлаў такім чынам (з адпаведныя абмежавання). Верхняя мяжа, здаецца, даступнай памяці.
    Стывен С. Твіді змесцавана пра тое, як усталяваць ULIMIT межы глабальна ці для кожнага карыстача пры загрузцы выкарыстаннем сцэнара, які запускае і pam_limit.
    У больш старых ядраў 2.2, аднак, лік адкрытых файлаў на працэс па-ранейшаму абмежавана да 1024, нават з вышэй змены.
    Гл. таксама 1998 пасля Оскара, у якім гаворыцца пра кожнага працэсу і ўсёй сістэмы абмежаванняў на файлавых дэскрыптараў у ядры 2.0.36.

Абмежаванні на тэмы

На любой архітэктуры, вам можа спатрэбіцца паменшыць колькасць стэку рэзервуецца месца для кожнага струменя, каб пазбегнуць вычарпання віртуальнай памяці. Вы можаце ўсталяваць гэта падчас выканання з pthread_attr_init (), калі вы выкарыстоўваеце Pthreads.

  • Solaris: ён падтрымлівае як шматлікія тэмы, якія змесцяцца ў памяці, я чую.
  • Linux 2.6 з NPTL: /proc/sys/vm/max_map_count можа запатрабавацца павялічыць пайсці вышэй 32 000 ці каля таго, калі тэмы. (Вы павінны будзеце выкарыстоўваць вельмі маленькі стэк тэмы, каб атрымаць які-небудзь, што колькасць струменяў, хоць, Вы знаходзіцеся на 64-бітны працэсар.) Гл. спіс рассылання NPTL, напрыклад, струмень з пазнакай "Не магу стварыць больш 32K тэмы?", для дадатковай інфармацыі.
  • Linux 2.4: /proc/sys/kernel/threads-max з'яўляецца максімальная колькасць струменяў, то па змаўчанні 2047 на маім Red Hat 8 сістэмы./Вы можаце наладзіць павелічэнне гэтага, як звычайна, паўтараючы новыя значэнні ў файл, напрыклад, "echo 4000 > /proc/sys/kernel/threads-max"
  • Linux 2.2: Нават 2.2.13 ядро абмяжоўвае лік струменяў, прынамсі на Intel. Я не ведаю, што абмежаванні на іншых архітэктурах. Мінго змесцаваны патч для 2.1.131 на Intel, што выдаліць гэту мяжу. Гэта, здаецца, інтэграваны ў 2.3.20.

    Гл. таксама Валан падрабязныя інструкцыі для падвышэння файл, струмень, і FD_SET межы ў 2,2 ядры. Wow. Гэты дакумент вас праз усе этапы шмат рэчаў, якія будзе цяжка высвятліць сабе, але некалькі састарэлі.

  • Java: Гледзіце падрабязны тэст Валан Асноўная інфармацыя, а таксама іх інфармацыя пра тое, як наладзіць розныя сістэмы для апрацоўкі шмат струменяў.

Java пытанняў

Да праз JDK 1.3, Java, стандартныя бібліятэкі сетак асноўным прапануюць адну нітку за кліента мадэль. Існаваў спосаб зрабіць неблокірующего чытанні, але не спосаб зрабіць неблокірующего піша.

У траўні 2001 гады, JDK 1.4 уведзены пакет java.nio аказваць усебаковую падтрымку для неблокірующего ўводу/высновы (і некаторых іншых тавараў). Гл. нататкі да выпуску для некаторымі абмоўкамі. Паспрабуйце яго і даць ВС зваротнай сувязі!

Java-HP таксама складаецца з тэму Апытанне API.

У 2000 году Мэтт валійскі ажыццяўляецца неблокірующего разеткі для Java, яго тэстаў прадукцыйнасці паказваюць, што яны маюць перавагі перад блакавальных сокетаў у серверах апрацоўкі вялікай колькасці (да 10000) злучэнняў. Яго бібліятэка класаў завецца Java-nbio, гэта частка Sandstorm праекта паказаны. Крытэры прадукцыйнасці з 10000 злучэнні даступныя.

Гл. таксама Годет эсэ Дын на тэму Java, сеткавага ўводу-высновы, і тэмы, і паперы Мэттом валійскі пра падзеі супраць працоўных струменяў.

Перад NIO, было некалькі прапаноў па паляпшэнні інтэрфейсаў API для Java-сетак:

  • Мэтт валійскі's Jaguar сістэма прапануе preserialized аб'екты, новыя байт-код Java, і кіраванне зменамі памяці, каб дазволіць выкарыстанне асінхроннага ўводу/высновы з Java.
  • Інтэрфейс Java для віртуальнай архітэктуры інтэрфейсу, ад ЦК. Чанг і Т. фон Eicken, прапануе змены ў кіраванні памяццю, каб выкарыстанне асінхроннага ўводу/высновы з Java.
  • JSR-51 быў праект Сонца, якое прыдумаў java.nio пакет. Мэтт валійскі ўдзел (хто кажа Сунь не слухае?).

Іншыя рады

  • Zero-Copy
    Як правіла, дадзеныя капіюецца шмат разоў на яго шляхі з месца на месца. Любая схема, якая ўхіляе гэтыя копіі голыя фізічны мінімум завецца "нуль-копіі".
    • Ogrisegg у нуль Томас-копію адправіць патч для mmaped файлаў пад Linux 2.4.17-2.4.20. Сцвярджае, што гэта хутчэй, чым Sendfile ().
    • IO-Liteз'яўляецца прапанова па наборы ўводу/высновы прымітываў, што дазваляе пазбавіцца ад неабходнасці шмат дзід.
    • Алан Кокс адзначыла, што нуль-копіі часам не варта яшчэ ў 1999 году. (Ён, як Sendfile (), усё ж.)
    • Инго рэалізавана форма нулявой копію пратаколу TCP у ядры 2.4 для TUX 1.0 у ліпені 2000 гады, і кажа, што зробіць яго даступным для карыстацкай прасторы хуткім часам.
    • Дрю Галлатін і Роберт Пікко дадалі некалькі нуль-копіі магчымасці для FreeBSD ; ідэя, здаецца, што пры выкліку Write () ці чытаць () для сокета, паказальнік старонкі краю, і аб'ём перададзеных дадзеных знаходзіцца ў меры старонцы, * і * вы не адразу паўторнага выкарыстання буфера, кіраванне трукі памяці будзе выкарыстоўвацца, каб пазбегнуць дзід. Але пагледзіце, followups на гэта паведамленне на Linux-ядро для's асцярогі людзей пра хуткасць гэтых прыёмаў кіравання памяццю.

      У адпаведнасці з цыдулкай ад Норіюкі соды:

      Адпраўка боку нулявой копія падтрымліваецца пачынальна з NetBSD-1.6-рэлізе паказана "SOSEND_LOAN" опцыі ядра. Гэты варыянт у наш час па змаўчанні на NetBSD-ток (вы можаце адключыць гэту функцыю, паказаўшы "SOSEND_NO_LOAN" у ядры опцыю NetBSD_current). З дапамогай гэтай функцыі нулявога копіі аўтаматычна ўключаецца, калі дадзеныя больш за 4096 байт задаюцца ў выглядзе дадзеных быць адпраўлена.
    • Sendfile (), які можна рэалізаваць нулявой копіі сетак.
      Sendfile () у Linux і FreeBSD дазваляе вам сказаць ядро пасылаць часткі ці ўсяго файла. Гэта дазваляе АС зрабіць гэта як мага больш эфектыўна. Ён можа выкарыстоўвацца аднолькава добра на серверах з выкарыстаннем струменяў ці сервераў з выкарыстаннем неблокірующего I/O. (У Linux, гэта дрэнна дакументаваны ў дадзены момант; выкарыстоўваць _syscall4 назваць яго. Andi Kleen піша новыя старонкі чалавек, якія ахопліваюць таксама і гэта. Гл. Вывучэнне Sendfile сістэмных выклікаў Джеффом Трантер у Linux Gazette пытанню 91.) Ходзяць чуткі, FTP. cdrom.com выйгралі прыкметна ад Sendfile ().

      Нуль-копіі ажыццяўлення Sendfile () на сваім шляху для ядра 2.4. Гл. LWN 25 студзеня 2001.

      Адзін распрацоўнік, які выкарыстоўвае Sendfile () з дакладамі FreeBSD, што выкарыстанне POLLWRBAND замест POLLOUT што ёсць вялікая розніца.

      Solaris 8 (па стане на ў ліпені 2001 гады абноўленая) мае выкліку, sendfilev новай сістэмы. Копія старонцы тут... Solaris 8 7/01 выпуску таксама згадваць пра гэта. Я падазраю, што гэта будзе найболей карысна пры адпраўцы на сокет у рэжым блакавання; гэта было б трохі боль для выкарыстання з разблакоўку сокета.

  • Пазбягайце малых кадраў з дапамогай writev (ці TCP_CORK)
    Новая опцыя сокета пад Linux, TCP_CORK, паведамляе ядру, каб пазбегнуць адпраўкі частковыя кадры, што дапамагае трохі, напрыклад, калі Ёсць шмат маленькіх напісаць () выклікае Вы не можаце расслаенне разам па некаторых чынніках. Адключэнне опцыі скідае буфер. Лепш выкарыстоўваць writev (), хоць...

    Гл. LWN 25 студзеня 2001 па рэзюмэ некаторыя вельмі цікавыя дыскусіі на Linux-ядры о TCP_CORK і магчымыя альтэрнатыўныя MSG_MORE.

  • Паводзьце сябе разумна пры перагрузцы.
    [ Provos, рычаг, і Твіді 2000 ] адзначае, што падзенне ўваходныя злучэнні, калі сервер перагружаны паляпшэнні формы крывой прадукцыйнасці, і зніжэнне агульнага ўзроўня памылак. Яны выкарыстоўвалі згладжанай версіі "колькасць кліентаў з I/O гатовыя", як мера перагрузкі. Гэта тэхніка павінна быць лёгка дастасоўныя да сервераў з пісьмовага абраць, апытанне, ці любы сістэмны выклік, які вяртае кол-у гатовасць падзей за званок (напрыклад, /dev/poll ці sigtimedwait4 ()).
  • Некаторыя праграмы могуць выняць выгаду з выкарыстання не-POSIX Threads.
    Не ўсе тэмы створаны роўнымі. Клон () у Linux (і яго сяброў у іншых аперацыйных сістэмах) дазваляе ствараць струмень, які мае свой уласны бягучы працоўны каталог, напрыклад, якія могуць быць вельмі карысныя пры ажыццяўленні FTP сервера. Гл. Hoser FTPd для прыкладу выкарыстанне ўласных струменяў, а не Pthreads.
  • Кэшаванне вашых уласных дадзеных часам можа быць перамогі.
    "Re: Выпраўленне для гібрыдных праблемы сервер" ад Vivek Sadananda Пай (vivek@cs.rice.edu) на Нью-HTTPD, 9 траўня, гаворыцца:

    "Я ў параўнанні сыравіны прадукцыйнасць абярыце Сервер на аснове некалькіх працэсаў сервера ва FreeBSD і Solaris/x86. На microbenchmarks, ёсць толькі маргінальныя розніца ў прадукцыйнасці, якія вынікаюць з архітэктуры праграмнага забеспячэння. Вялікую прадукцыйнасць выйграць для выбару Серверы на базе сцеблы ад выканання прыкладанняў узроўня кэшавання. Хоць некалькі працэсаў серверы могуць рабіць гэта на больш высокі кошт, гэта цяжэй, каб атрымаць тыя ж перавагі на рэальных працоўных нагрузак (В. С. microbenchmarks). Я буду ўяўляць гэтыя вымярэнні як частка паперы, што з'явяцца на наступнай канферэнцыі Usenix. Калі ў вас ёсць прыпіска, артыкул даступная на http://www.cs.rice.edu/ ~ vivek/flash99 /"

Іншыя абмежаванні

  • Сістэма бібліятэк Старога можа выкарыстоўваць 16 зменных трохі правесці файл ручкамі, які выклікае праблемы вышэй 32767 ручкамі. glibc2.1 павінна быць у парадку.
  • Шматлікія сістэмы выкарыстоўваюць 16 зменных трохі правесці працэс ці струмень ідэнтыфікатары. Было б цікава ў порт маштабаванасць цеста Валан - З, і паглядзець, што верхняя мяжа на колькасць струменяў для розных аперацыйных сістэм.
  • Занадта шмат струменяў лакальная памяць вылучаную на некаторых аперацыйных сістэмах, калі кожны струмень атрымлівае 1 МБ, а агульны В.М. прасторы роўны 2 ГБ, што стварае верхнюю мяжу 2000 струменяў.
  • Пагледзіце на графік параўнання прадукцыйнасці ў ніжняй частцы http://www.acme.com/software/thttpd/benchmarks.html. Звернеце ўвагу, як розныя серверы непрыемнасці вышэй 128 злучэнняў, нават на Solaris 2.6? Любай, хто высвятляе, чаму, дазвольце мне ведаць.
    Нататка: калі TCP стэка памылка, якая прыводзіла да кароткіх (200 мс) затрымкі ці FIN SYN час, як Linux 2.2.0-2.2.6 было, і АС ці HTTP дэман мае цвёрдае абмежаванне на колькасць адкрытых злучэнняў, варта чакаць менавіта такіх паводзін. Там могуць быць і іншыя чыннікі.

Ядро пытанні

Для Linux, гэта выглядае як ядро вузкія месцы фіксаваных увесь час. Гл. Linux Weekly News, ядро руху, - ядры спісу рассылання Linux, і маёй Mindcraft Redux старонкі.

У сакавіку 1999 гады Microsoft аўтарамі тэстаў параўнання NT на Linux на абслугоўванне вялікай колькасці HTTP і SMB кліентаў, у якіх яны не бачылі добрых вынікаў ад Linux. Гл. таксама мой артыкул у красавіку 1999 Mindcraft's Крытэры для атрымання дадатковай інфармацыі.

Гл. таксама Linux маштабаванасць праекта. Яны робяць цікавую працу, у тым ліку намякаючы апытання патч Нільс Provos, і некаторыя працы па праблеме статак грымотным.

Гл. таксама Jagdis працы па паляпшэнні Майк абярыце () і апытанне () ; вось Пачаць Майк пра гэта.

Mohit Арон (aron@cs.rice.edu) піша, што хуткасць аснове сінхранізацыі ў TCP можа палепшыць час водгуку HTTP павальнейшым" злучэнні на 80%.

Вымярэнне прадукцыйнасці сервера

Два выпрабаванні, у прыватнасці, проста, цікава, і цяжка:

  1. сыравіны злучэнняў у секунду (колькі файлаў 512 байт у секунду вы можаце служыць?)
  2. Агульная хуткасць перадачы дадзеных на вялікіх файлах са шмат павольных кліентаў (колькі 28.8k мадэм кліенты могуць адначасова спампоўваць з сервера перад выступам ідзе да чарцей?)

Джеф Poskanzer апублікаваў крытэры параўнання шматлікіх вэб-сервераў. Гл. http://www.acme.com/software/thttpd/benchmarks.html за яго вынікі.

У мяне таксама ёсць некалькі старых нататак пра параўнанне thttpd у Apache, якія могуць уяўляць цікавасць для пачаткоўцаў.

Чак рычаг увесь час нагадвае нам о і Druschel на паперы Банга на вэб-серверы бенчмаркінга. Гэта варта прачытаць.

IBM мае выдатны дакумент пад назвай Java Server тэстаў [Бейлор і інш., 2000]. Гэта варта прачытаць.

Прыклады

Цікавыя абярыце ()-сервераў на базе

  • thttpd Вельмі проста. Выкарыстанне адзінага працэсу. Ён мае добрую прадукцыйнасць, але не маштабуецца з лікам працэсараў. Можна таксама выкарыстоўваць kqueue.
  • mathopd. Як і ў thttpd.
  • fhttpd
  • баа
  • Roxen
  • Зеўс, камерцыйны сервер, які спрабуе быць абсалютнай хутка. Гл. іх Кіраўніцтва па наладзе.
  • Іншых не-Java сервераў, пералічаных у http://www.acme.com/software/thttpd/benchmarks.html
  • BetaFTPd
  • Flash-Lite - вэб-сервер, выкарыстоўваючы IO-Lite.
  • Flash: эфектыўны і партатыўных вэб-сервера - выкарыстоўвае выбару (), ММАП (), mincore ()
  • Вэб-сервер Flash стану на 2003 год - выкарыстоўвае выбару (), змена Sendfile (), асінхронны адкрытым ()
  • Xitami - выкарыстоўвае выбару () для ажыццяўлення сваёй уласнай абстракцыю струменя для пераноснасці на сістэмах без тэмы.
  • Медузы - сервер напісання інструментара ў Python, які спрабуе забяспечыць вельмі высокую прадукцыйнасць.
  • userver - маленькі сервер HTTP, якія могуць выкарыстоўваць выбару, апытанне, epoll ці SIGIO

Цікава /dev/poll-сервераў

  • Н. Provos, С. Левер, "Якая маштабуецца сетка ўводу/высновы ў Linux", травень 2000 гады. [FREENIX трэк, Proc. USENIX 2000 гады, Сан-Діего, штат Каліфорнія (чэрвень, 2000).] Апісвае версію thttpd мадыфікаванае для падтрымкі /dev/poll. Прадукцыйнасць у параўнанні з phhttpd.

Цікавыя kqueue ()-сервераў на базе

  • thttpd (пачынальна з версіі 2,21?)
  • Адрыян Чадд кажа: "Я раблю шмат працы, каб кальмар самай справе, як сістэма ўводу-высновы kqueue", гэта афіцыйныя подпроекта Squid, гл. http://squid.sourceforge.net/projects.html#commloops відавочна. (Гэта навей, чым Бенно патч.)

Цікавыя рэальным часе сігнал-сервераў

  • Хром у X15. Пры гэтым выкарыстоўваецца ядры SIGIO асаблівасць 2,4 разам з Sendfile () і TCP_CORK, і, па паведамленнях дасягае больш высокай хуткасці, чым нават TUX. крыніца даступны пад супольнасці крыніцы (не з адкрытым зыходным кодам) ліцэнзіі. Гл. арыгінальная аб'ява Фабіо Ріккарді.
  • Зак Браун phhttpd - "хуткі вэб-сервер, што была напісана, каб прадэманстраваць SIGIO/SIGINFO мадэлі падзей. разгледзець гэты код вельмі эксперыментальных і сябе вельмі псіхічнага калі вы паспрабуеце выкарыстоўваць яго ў вытворчае асяроддзе." Выкарыстанне SIGINFO асаблівасці 2.3.21 ці пазнейшай версіі, і складаецца з неабходныя патчы для ранніх версій ядраў. чуткам, нават хутчэй, чым khttpd. Гл. свой пост 31 траўня 1999 гады для некаторых нататак.

Цікавыя струмень-сервераў

Цікавае ў ядры сервера

Іншыя цікавыя спасылкі



Valid CSS Valid XHTML 1.0 Transitional

---