Mavzu: Uzulishning tarqalishi haqidagi masala
Ushbu maqolada men x86 tizimidagi tashqi qurilmalardan uzilishlarni etkazib berish mexanizmlarini ko'rib chiqmoqchiman va savollarga javob berishga harakat qilaman:
PIC nima va u nima uchun?
APIC nima va u nima uchun? LAPIC va I/O APIC nima uchun?
APIC, xAPIC va x2APIC o'rtasidagi farq nima?
MSI nima? MSI va MSI-X o'rtasidagi farq nima?
$PIR, MPtable, ACPI jadvallari bunga qanday bog'liq?
Agar siz ushbu savollarning birortasiga javob olmoqchi bo'lsangiz yoki shunchaki x86 tizimidagi uzilish kontrollerlarining evolyutsiyasi bilan tanishmoqchi bo'lsangiz, mushuk ostida xush kelibsiz.
Kirish
Biz hammamiz uzilish nima ekanligini bilamiz. Bilmaydiganlar uchun Vikipediyadan iqtibos:
Interrupt (inglizcha interrupt) - protsessorga zudlik bilan e'tibor berishni talab qiladigan voqea sodir bo'lganligi haqida xabar beruvchi dasturiy ta'minot yoki apparatdan signal. Uzilish protsessorga protsessor tomonidan bajarilayotgan joriy kodni uzishni talab qiluvchi yuqori ustuvor hodisa yuz berganligi haqida xabar beradi. Protsessor o'zining joriy faoliyatini to'xtatib turish, holatini saqlash va hodisaga javob beradigan va unga xizmat ko'rsatadigan uzilish ishlovchisi (yoki uzilishni qayta ishlovchi) deb nomlangan funktsiyani bajarish orqali javob beradi, so'ngra boshqaruvni uzilgan kodga qaytaradi.
Uzilish signalining manbasiga qarab, ular quyidagilarga bo'linadi:
asinxron yoki tashqi (apparat) - tashqi apparat qurilmalaridan (masalan, periferik qurilmalar) kelib chiqadigan va har qanday ixtiyoriy vaqtda sodir bo'lishi mumkin bo'lgan hodisalar: taymerdan, tarmoq kartasidan yoki diskdan signal, klaviatura tugmachalarini bosish, sichqonchaning harakati. Tizimda bunday uzilishning sodir bo'lishi uzilish so'rovi (IRQ) sifatida qaraladi - qurilmalar OTdan e'tibor talab qilishlari haqida xabar beradi;
sinxron yoki ichki - mashina kodini bajarish jarayonida ba'zi shartlarning buzilishi natijasida protsessorning o'zida sodir bo'ladigan hodisalar: nolga bo'linish yoki stekning to'lib ketishi, noto'g'ri xotira manzillariga kirish yoki yaroqsiz operatsiya kodiga kirish;
Ushbu maqolada men tashqi IRQlarni muhokama qilmoqchiman.
Ular nima uchun kerak? Aytaylik, tarmoq kartasi kelganda kirish paketi ustida qandaydir amallarni bajarmoqchimiz. Tarmoq kartasidan doimiy ravishda "yangi paketingiz bormi?" Deb so'ramaslik uchun. va buning uchun protsessor resurslarini isrof qilmasdan, siz IRQ uzilishidan foydalanishingiz mumkin. Qurilmaning uzilish chizig'i protsessorning INTR liniyasiga ulanadi va paket qabul qilinganda tarmoq kartasi bu chiziqni "tortadi". Protsessor buning uchun ma'lumot borligini tushunadi va paketni o'qiydi.
Ammo ko'plab qurilmalar bo'lsa-chi? Siz protsessor oyoqlarining barcha tashqi qurilmalariga zaxiralay olmaysiz.
Linuxda yuqori trafik oqimlari va uzilishlar boshqaruvi nashri ortidan yozilgan
Shahar tarmog'imizda 30 mingdan ortiq abonent bor. Tashqi kanallarning umumiy hajmi 3 gigabitdan ortiq. Va eslatib o'tilgan maqolada berilgan maslahat, biz bir necha yil oldin o'tdik. Shunday qilib, men mavzuni kengaytirmoqchiman va ko'tarilgan masala doirasida o'zimning eng yaxshi tajribalarimni o'quvchilar bilan baham ko'rmoqchiman.
Eslatma Linux ostida router va NAT serverni sozlash/sozlashning nuanslarini, shuningdek uzilishlarni taqsimlash bo'yicha ba'zi tushuntirishlarni tavsiflaydi.
Xalaqit beradi
Tarmoq kartasi uzilishlarini turli yadrolar bo'ylab tarqatish - bu Linux routeriga yuk ortganda tizim ma'muri duch keladigan birinchi narsa. Yuqoridagi maqolada mavzu etarlicha batafsil yoritilgan - shuning uchun biz bu masalaga uzoq vaqt to'xtalmaymiz.
Men shunchaki ta'kidlamoqchiman:
agar siz uzilishlarni qo'lda tashlasangiz, irqbalance xizmatini to'xtatishingiz kerak. Ushbu xizmat faqat protsessor yadrolari orasidagi uzilishlarni avtomatik tartibga solish uchun mo'ljallangan. Agar siz ushbu ishni qo'lda qilsangiz, xizmatni to'xtatish yaxshiroqdir;
"avtomatik yuklash" (masalan, /etc/rc.local) ga tegishli o'zgartirishlarni kiritishni unutmang - chunki serverni qayta ishga tushirgandan so'ng, barcha uzilishlar yana bitta yadroda to'plamga taqsimlanadi;
serverni qayta ishga tushirgandan so'ng, tarmoq kartalari yangi uzilish raqamlarini olishlari mumkin (va, ehtimol, shunday bo'ladi). Shuning uchun /etc/rc.local-da ma'lum bir uzilish raqamlarini qo'lda kiritmaslik yaxshiroqdir - yordamchi skript yordamida qaysi tarmoq uzilishini aniqlashni avtomatlashtirish.
router
Asl maqolada "agar server faqat marshrutizator sifatida ishlayotgan bo'lsa, TCP stekini sozlash juda muhim emas" degan ibora mavjud. Bu bayonot tubdan noto'g'ri. Albatta, sozlash kichik oqimlarda katta rol o'ynamaydi. Biroq, agar sizda katta tarmoq va mos keladigan yuk bo'lsa, unda siz tarmoq stekini sozlash bilan shug'ullanishingiz kerak bo'ladi.
Avvalo, agar gigabitlar tarmog'ingizda "yurishayotgan" bo'lsa, u holda serverlaringiz va kalitlaringizdagi MTUga e'tibor berish mantiqan. Xulosa qilib aytganda, MTU - bu tarmoq bo'ylab parchalanishga murojaat qilmasdan uzatilishi mumkin bo'lgan paketlar miqdori. Bular. sizning bitta routeringiz boshqasiga bo'linmasdan qancha ma'lumot o'tkazishi mumkin. Tarmoq orqali uzatiladigan ma'lumotlar hajmining sezilarli o'sishi bilan kichik ma'lumotlar paketlarini tez-tez va tez-tez yuborishdan ko'ra, kattaroq paketlarni kamroq yuborish ancha samaraliroq bo'ladi.
Linuxda MTU ni oshirish
/sbin/ifconfig eth0 mtu 9000
Kalitlarda MTUni oshirish
Kommutatsiya uskunasida bu odatda jumbo-ramka deb ataladi. Xususan, Cisco Catalyst 3750 uchun
3750(config)# tizimi mtu jumbo 9000
3750(config)# chiqish
3750# qayta yuklash
E'tibor bering, keyin kalitni qayta ishga tushirish kerak. Aytgancha, mtu jumbo faqat gigabitli havolalar uchun amal qiladi - bunday buyruq 100-Mbps ga ta'sir qilmaydi.
Linuxda uzatish navbatini oshirish
/sbin/ifconfig eth0 txqueuelen 10000
Standart qiymat 1000. Gigabitli havolalar uchun 10000 ni belgilash tavsiya etiladi. Xulosa qilib aytganda, bu uzatish buferining o'lchamidir. Bufer ushbu chegaragacha to'ldirilsa, ma'lumotlar tarmoqqa uzatiladi.
Shuni yodda tutingki, agar siz ba'zi bir uskunaning interfeysida MTU o'lchamini o'zgartirsangiz, uning "qo'shnisi" interfeysida ham xuddi shunday qilishingiz kerak. Ya'ni, agar siz Linux routerining interfeysida MTU ni 9000 ga oshirgan bo'lsangiz, u holda ushbu router ulangan kalit portida jumbo-ramkani yoqishingiz kerak. Aks holda, tarmoq ishlaydi, lekin juda yomon: paketlar tarmoq orqali "bitta orqali" o'tadi.
Natijalar
Ushbu o'zgarishlarning barchasi natijasida tarmoqdagi "pinglar" ortadi - lekin umumiy o'tkazuvchanlik sezilarli darajada oshadi va faol uskunalarga yuk kamayadi.
NAT serveri
NAT (Network Address Translation) operatsiyasi eng qimmat (ma'noda resurs talab qiladigan) operatsiyalardan biridir. Shuning uchun, agar sizda katta tarmoq mavjud bo'lsa, NAT serverini sozlamasdan qilolmaysiz.
Kuzatiladigan ulanishlar sonini oshiring
O'z vazifasini bajarish uchun NAT serveri u orqali o'tadigan barcha ulanishlarni "eslab qolishi" kerak. Bu "ping" yoki kimningdir "ICQ" bo'ladimi - bu barcha seanslarni NAT serveri "eslab qoladi" va maxsus jadvalda o'z xotirasida kuzatib boradi. Seans yopilganda, u haqidagi ma'lumotlar jadvaldan o'chiriladi. Ushbu jadvalning o'lchami belgilangan. Shuning uchun agar server orqali trafik juda ko'p bo'lsa va jadval hajmi etarli bo'lmasa, NAT serveri paketlarni "tashlab qo'yishni", seanslarni buzishni boshlaydi, Internet dahshatli uzilishlar bilan ishlay boshlaydi va ba'zan hatto shunday bo'ladi. SSH orqali NAT serveriga kirish imkonsiz.
Bunday dahshatlarning oldini olish uchun stol o'lchamini NAT orqali o'tadigan trafikga mos ravishda etarli darajada oshirish kerak:
/sbin/sysctl -w net.netfilter.nf_conntrack_max=524288
Agar sizda NAT serverida 1 gigabaytdan kam operativ xotira bo'lsa, bunday katta qiymatni o'rnatish tavsiya etilmaydi.
Joriy qiymatni quyidagicha ko'rishingiz mumkin:
/sbin/sysctl net.netfilter.nf_conntrack_max
Qarang, qanchalik to'laulanishni kuzatish stolida emas, buni shunday qilishingiz mumkin:
/sbin/sysctl net.netfilter.nf_conntrack_count
Xesh jadvalining hajmini oshirish
Conntrack yozuvlari ro'yxatini saqlaydigan xesh jadvali ham mutanosib ravishda oshirilishi kerak.
echo 65536 > /sys/module/nf_conntrack/parameters/hashsize
Qoida oddiy: hashsize = nf_conntrack_max / 8
Vaqt o'tishi qiymatlarini kamaytirish
Esingizda bo'lsa, NAT server faqat u orqali o'tadigan "jonli" seanslarni kuzatib boradi. Seans yopilganda, jadval to'lib ketmasligi uchun u haqidagi ma'lumotlar o'chiriladi. Seanslar haqidagi ma'lumotlar ham vaqt tugashi bilan o'chiriladi. Ya'ni, agar uzoq vaqt davomida almashinuv aloqasi ichida trafik bo'lmasa, u yopiladi va u haqidagi ma'lumotlar ham NAT xotirasidan o'chiriladi.
Biroq, standart vaqt tugashi qiymatlari juda katta. Shuning uchun, katta trafik oqimlari bilan, hatto nf_conntrack_max chegarasiga qadar cho'zilgan bo'lsangiz ham, siz baribir jadvalning to'lib ketishi va ulanishning uzilishi xavfini tug'dirasiz.
Buning oldini olish uchun NAT serverida ulanishni kuzatish vaqtini to'g'ri o'rnatishingiz kerak.
Joriy qiymatlarni ko'rish mumkin, masalan:
sysctl -a | grep conntrack | grep timeout
В результате вы увидите что-то подобное:
net.netfilter.nf_conntrack_generic_timeout = 600
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 60
net.netfilter.nf_conntrack_tcp_timeout_established = 432000
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 30
Do'stlaringiz bilan baham: |