Lide a pou atik la te fèt espontaneman nan yon diskisyon nan kòmantè yo nan atik la .

Reyalite a se ke espesifik nan entèn nan sèvis nou yo se depo a nan yon kantite gwo ti dosye. Nan moman sa a nou gen sou dè santèn de terabytes nan done sa yo. Apre sa, nou te rankontre kèk evidan ak pa tèlman evidan rato ak siksè navige yo.
Se poutèt sa, mwen pataje eksperyans nou an, petèt li pral itil yon moun.
Pwoblèm youn: "Pa gen espas ki rete sou aparèy la"
Kòm mansyone nan atik ki endike anwo a, pwoblèm nan se ke gen blòk gratis sou sistèm nan dosye, men inode la te fini.
Ou ka tcheke kantite inodes itilize ak gratis ak lòd la df -ih:

Mwen pa pral rakonte atik la; an ti bout tan, disk la gen tou de blòk pou done tèt li ak blòk pou meta-enfòmasyon, ke yo rele tou inodes (nĹud endèks). Nimewo yo fikse lè sistèm fichye a inisyalize (n ap pale de ext2 ak siksesè li yo) epi yo pa chanje plis. Balans nan blòk done ak inodes kalkile apati done estatistik mwayèn, men nan ka nou an, lè gen anpil ti fichye, balans lan ta dwe chanje nan direksyon kantite inodes - ta dwe gen plis nan yo.
Đ Linux Nou deja bay opsyon ak diferan balans, epi tout konfigirasyon pre-kalkile sa yo nan dosye a. /etc/mke2fs.conf.
Se poutèt sa, pandan inisyalizasyon inisyal la nan sistèm nan dosye atravè mke2fs, ou ka presize pwofil la vle.
Men kèk egzanp nan dosye a:
small = {
blocksize = 1024
inode_size = 128
inode_ratio = 4096
}
big = {
inode_ratio = 32768
}
largefile = {
inode_ratio = 1048576
blocksize = -1
}
Ou ka chwazi ka itilize a vle lè l sèvi avèk opsyon "-T" lè w ap rele mke2fs. Ou kapab tou manyèlman mete paramèt yo mande yo si pa gen okenn solisyon pare-fè.
Plis detay yo dekri nan manyèl yo pou mke2fs.conf и mke2fs.
Yon karakteristik ki pa manyen nan atik ki endike anwo a se ke ou ka mete gwosè a nan blòk done a. Li evidan, pou fichye gwo li fè sans pou gen yon pi gwo gwosè blòk, pou ti fichye li fè sans pou gen yon pi piti.
Sepandan, li vo konsidere tankou yon karakteristik enteresan tankou achitekti processeur a.
Mwen yon fwa te panse ke pou dosye foto gwo mwen te bezwen yon gwosè blòk pi gwo. Li te rive lakay ou, sou yon magazen dosye lakay yo te rele WD sou achitekti ARM. San ezitasyon, mwen mete gwosè blòk swa 8k oswa 16k olye pou yo 4k estanda a, mwen te deja mezire ekonomi yo. Ak tout bagay te byen jiskaske depo nan tèt li echwe, ak disk la te toujou vivan. Ăske w gen enstale disk la nan yon òdinatè regilye ak yon processeur Intel regilye, mwen te resevwa yon sipriz: yon gwosè blòk ki pa sipòte. Nou rive. Done yo la, tout bagay anfòm, men li enposib pou li. i386 ak processeurs menm jan an pa ka travay ak gwosè blòk ki pa koresponn ak gwosè paj memwa a, ki se egzakteman 4k. An jeneral, pwoblèm nan te fini ak itilizasyon sèvis piblik soti nan espas itilizatè, tout bagay te ralanti ak tris, men done yo te sove. Si gen moun ki enterese, google non sèvis piblik la fuseext2. Moral: swa panse nan tout ka yo davans, oswa pa pretann yo dwe yon superhero epi sèvi ak anviwònman estanda pou Menager.
UPD. Dapre kòmantè itilizatè Mwen ta renmen klarifye ke pou i386 gwosè blòk la pa ta dwe depase 4k, men li pa oblije egzakteman 4k, i.e. 1k ak 2k akseptab.
Se konsa, ki jan nou te rezoud pwoblèm yo?
Premyèman, nou te rankontre yon pwoblèm lè yon disk milti-terabyte te plen ak done, epi nou pa t 'kapab chanje konfigirasyon sistèm nan dosye.
Dezyèmman, yo te bezwen yon solisyon ijan.
Kòm yon rezilta, nou te rive nan konklizyon an ke nou bezwen chanje balans lan pa diminye kantite dosye.
Pou diminye kantite dosye yo, li te deside mete dosye yo nan yon sèl achiv komen. Lè nou pran an konsiderasyon spesifik nou yo, nou mete tout fichye yo sou yon sèten peryòd tan nan yon sèl achiv, epi nou te pote achiv lè l sèvi avèk yon travay cron chak swa.
Chwazi achiv postal. Nan kòmantè yo nan atik anvan an, goudwon ââyo te sijere, men gen yon sèl difikilte ak li: li pa gen yon tab nan matyè, ak dosye yo ki nan li yo estoke nan yon kouran (se pa sèlman ke "goudwon" se yon abrevyasyon. pou "Tape Archive", eritaj la nan kondui kasèt), sa vle di. si ou bezwen li yon fichye nan fen achiv la, ou bezwen li tout achiv la, paske li pa genyen konpanse pou chak fichye parapò ak kòmansman achiv la. Se poutèt sa li se yon operasyon long. Tout bagay pi bon nan zip: li gen menm tab la nan kontni ak konpanse dosye nan achiv la, ak tan aksè nan chak dosye pa depann de kote li yo. Oke, nan ka nou an, li te posib yo mete opsyon nan konpresyon nan "0", paske tout dosye yo te deja konprese nan gzip davans.
Kliyan yo rekipere dosye atravè nginx, epi dapre ansyen API a, jis non fichye a espesifye, pou egzanp tankou sa a:
http://www.server.com/hydra/20170416/0453/3bd24ae7-1df4-4d76-9d28-5b7fcb7fd8e5
Pou depake dosye sou vole a, nou jwenn ak konekte modil nginx-unzip-modil la () ak mete kanpe de upstreams.
Rezilta a se konfigirasyon sa a:

De lame yo nan anviwònman yo te sanble ak sa a:
server {
listen *:8081;
location / {
root /home/filestorage;
}
}server {
listen *:8082;
location ~ ^/hydra/(d+)/(d+)/(.*)$ {
root /home/filestorage;
file_in_unzip_archivefile "/home/filestorage/hydra/$1/$2.zip";
file_in_unzip_extract "$2/$3";
file_in_unzip;
}
}
Ak konfigirasyon an en sou nginx a en:
upstream storage {
server server.com:8081;
server server.com:8082;
}
Ki jan li travay:
- Kliyan an ale devan nginx
- Front nginx eseye sèvi fichye a soti nan premye en, i.e. dirèkteman nan sistèm dosye a
- Si pa gen okenn dosye, li eseye voye soti nan dezyèm en an, ki ap eseye jwenn dosye a andedan achiv la.
Pwoblèm de: ankò "Pa gen espas ki rete sou aparèy"
Sa a se dezyèm pwoblèm nou rankontre lè gen anpil dosye nan yon anyè.
Nou ap eseye kreye yon dosye, sistèm nan plenyen ke pa gen okenn espas. Nou chanje non fichye a epi eseye kreye l ankò.
Li sanble.
Li sanble yon bagay tankou sa a:

Tcheke inodes yo pa t 'bay anyen - gen anpil gratis.
Tcheke kote a se menm bagay la.
Nou te panse ke ta ka gen twòp fichye nan anyè a, epi gen yon limit sou sa a, men ankò pa gen okenn: Kantite maksimòm fichye pou chak anyè: ~1.3 à 10^20
Wi, epi ou ka kreye yon fichye si ou chanje non an.
Konklizyon - pwoblèm nan se nan non dosye a.
Plis rechèch te montre ke pwoblèm nan se nan algorithm hashing la lè konstwi endèks anyè a; ak yon gwo kantite fichye, yo obsève kolizyon ak tout konsekans ki vini yo. Ou ka li plis detay isit la:
Ou ka enfim opsyon sa a, men... chache yon fichye pa non ka vin yon fason enprevizib long lè w ap chèche nan tout fichye yo.
tune2fs -O "^dir_index" /dev/sdb3
An jeneral, sa a se yon solisyon tanporè ki ta ka travay.
Moral: yon anpil nan dosye nan yon anyè se nòmalman yon move bagay. Pa gen okenn nesesite pou fè sa.
Anjeneral nan ka sa yo, anyè yo kreye pa premye lèt yo nan non dosye a oswa pa kèk lòt paramèt, pou egzanp, pa dat, nan pifò ka sa a sove jounen an.
Men, kantite total ti fichye toujou move, menm si yo divize an repèrtwar - Lè sa a, wè premye pwoblèm nan.
Pwoblèm twa: ki jan yo wè lis la nan dosye si gen anpil nan yo
Nan sitiyasyon nou an, lè nou gen yon anpil nan dosye, yon fason oswa yon lòt nou te fè fas a pwoblèm nan ki jan yo wè sa ki nan anyè a.
Solisyon estanda - lòd ls.
Ok, ann wè sa k ap pase sou 4772098 fichye yo:
$ time ls /home/app/express.repository/offercache/ >/dev/null
real 0m30.203s
user 0m28.327s
sys 0m1.876s
30 segonn... pral twòp. Anplis, pi fò nan tan an pase sou pwosesis dosye nan espas itilizatè, epi yo pa ditou sou operasyon an nan nwayo a.
Men, gen yon solisyon:
$ time find /home/app/express.repository/offercache/ >/dev/null
real 0m3.714s
user 0m1.998s
sys 0m1.717s
3 segonn. 10 fwa pi vit.
Hooray!
UPD.
Yon solisyon menm pi vit nan men itilizatè a - enfim klasman ls
time ls -U /home/app/express.repository/offercache/ >/dev/null
real 0m2.985s
user 0m1.377s
sys 0m1.608s
Pwoblèm kat: gwo LA lè w ap travay ak dosye
De tan zan tan yon sitiyasyon rive lè ou bezwen kopye yon pakèt fichye soti nan yon machin nan yon lòt. An menm tan an, LA souvan ap grandi ireyèl, paske tout bagay depann sou pèfòmans nan disk yo tèt yo.
Bagay ki pi entelijan ou vle fè se sèvi ak yon SSD. Vrèman fre. Kesyon an sèlman se pri a nan milti-terabyte SSD.
Men, si disk yo se òdinè, ou bezwen kopye dosye, e sa a se tou yon sistèm pwodiksyon, kote surcharge mennen nan eksklamasyon satisfè soti nan kliyan? Gen omwen de zouti itil: nice и ionice.
nice â diminye priyorite nan pwosesis la, kòmsadwa orè a distribye plis tranch tan nan lòt pwosesis ki pi wo priyorite.
Nan pratik nou an, li te ede yo mete bèl nan maksimòm la (19 se priyorite minimòm lan, -20 (mwens 20) se maksimòm la).
ionice â ajiste I/O orè kòmsadwa
Si w ap itilize RAID epi li toudenkou bezwen senkronize (apre yon rdemare san siksè oswa ou bezwen retabli etalaj RAID la apre w fin ranplase yon disk), Lè sa a, nan kèk sitiyasyon li fè sans pou diminye vitès senkronizasyon an pou lòt pwosesis ka travay plis. oswa mwens ase. Kòmandman sa a ap ede pou sa:
echo 1000 > /proc/sys/dev/raid/speed_limit_max
Pwoblèm senk: Ki jan yo senkronize dosye an tan reyèl
Nou toujou gen menm kantite fichye ki bezwen fè bak sou yon dezyèm sèvè pou evite... Fichye yo toujou ap ekri, kidonk pou w ka gen yon minimòm de pèt, ou bezwen kopye yo pi vit posib.
Solisyon estanda: Rsync sou SSH.
Sa a se yon bon opsyon sof si ou bezwen fè li chak kèk segonn. Epi gen anpil dosye. Menm si ou pa kopye yo, ou toujou bezwen yon jan kanmenm konprann sa ki te chanje, epi konpare plizyè milyon dosye pran tan ak chaj sou disk yo.
Moun sa yo. nou bezwen imedyatman konnen sa ki bezwen yo dwe kopye, san yo pa kouri konparezon an chak fwa.
sekou a - lsyncd. Lsyncd - . Li travay tou atravè rsync, men anplis kontwole sistèm fichye a pou chanjman lè l sèvi avèk inotify ak fsevents epi sèlman kòmanse kopye dosye sa yo ki te parèt oswa chanje.
Pwoblèm sis: ki jan yo konprann ki moun ki chaje disk yo
Tout moun pwobableman konnen sa a, men kanmenm, ranpli foto a: gen yon lòd pou kontwole subsistèm ki gen kapasite a iotop - renmen top, men montre pwosesis yo ki pi aktivman itilize disk.

By wout la, bon ansyen tèt la tou pèmèt ou konprann si gen yon pwoblèm ak disk yo oswa ou pa. Gen de opsyon ki pi apwopriye pou sa: Chaj Mwayèn и IOwat.

Premye a montre konbyen pwosesis ki nan keu pou sèvis, anjeneral plis pase 2 - yon bagay deja ale mal. Lè aktivman kopye sou serveurs backup, nou pèmèt jiska 6-8, apre sa sitiyasyon an konsidere kòm nòmal.
Dezyèm lan se ki jan okipe processeur a ak operasyon ki gen kapasite. IOwait > 10% se yon rezon pou enkyetid, byenke sou sèvè nou yo ak yon pwofil chaj espesifik li se toujou 40-50%, e sa a se reyèlman nòmal la.
Mwen pral fini isit la, byenke gen pwobableman anpil pwen ke nou pa te oblije fè fas ak, mwen pral kontan tann pou kòmantè ak deskripsyon nan ka enteresan reyèl.
Sous: www.habr.com
