Atmintis dažniausiai ir lemia serverio dydį: jos pritrūksta pirmiausia, o kai pritrūksta, serveris ne sulėtėja, o sustabdo paslaugas. Šis gidas pateikia skaičiavimo taisyklę, kiek suvartoja kiekviena programos dalis, tipinius profilius ir būdą išmatuoti jau veikiantį serverį.
free -h stulpelį available, o ne stulpelį free.Serveris nevartoja atminties „apskritai“: kiekviena veikianti programa pasilaiko savo dalį tol, kol veikia. Todėl skaičiavimas prasideda nuo nuolat veikiančių procesų sąrašo, prie kurio pridedamas pikas ir atsarga:
Reikiama atmintis = (sistema + nuolatinės paslaugos + epizodinių užduočių pikas) × 1,25
Toliau pateikti dydžiai galioja įprasto dydžio programai, išmatuotai gamybinėje aplinkoje. Tai atspirties taškas; jūsų pačių programos matavimas, aprašytas žemiau, visada turi paskutinį žodį.
| Dalis | Tipinė atmintis | Kas lemia svyravimus |
|---|---|---|
| Nginx, Caddy (žiniatinklio serveris, tarpinis serveris) | nuo 10 iki 50 MB | Beveik pastovi: jungčių skaičius mažai ką keičia. |
| PHP-FPM (WordPress, Laravel, Symfony) | nuo 40 iki 80 MB vienam procesui | Procesų skaičius, ribojamas pm.max_children: 10 procesų, nuo 400 iki 800 MB. |
| Node.js (API, Next.js, NestJS) | nuo 60 iki 300 MB vienam procesui | Procesų skaičius (cluster režimas, PM2) ir krūvos dydis, ribojamas --max-old-space-size. |
| Python (Django, FastAPI, Flask) | nuo 80 iki 200 MB vienam procesui | Gunicorn ar Uvicorn darbinių procesų (workers) skaičius ir įkeltos bibliotekos: pandas ar mašininio mokymosi modelis prideda šimtus MB. |
| Java (Spring Boot) | nuo 300 MB iki 1 GB vienai programai | Didžiausias krūvos dydis: pagal numatytuosius nustatymus JVM pasiima ketvirtadalį atminties, kurią mato. |
| Go, Rust | nuo 10 iki 100 MB | Duomenys, kuriuos programa pati laiko atmintyje. |
| PostgreSQL | 25 % atminties shared_buffers, plius keli MB kiekvienai jungčiai | Dažnai skaitomų duomenų apimtis, jungčių skaičius, work_mem. |
| MySQL, MariaDB | innodb_buffer_pool_size, pagal numatytuosius nustatymus 128 MB | Serveryje, skirtame tik duomenų bazei, šis buferis dažnai užima iki 80 % atminties. |
| Redis | Duomenų dydis, plius jo struktūros | Įrašant į diską, pakeisti puslapiai dubliuojami: blogiausiu atveju iki dvigubo dydžio. |
| Elasticsearch, OpenSearch | mažiausiai 2 GB krūvai | Krūva neviršija pusės atminties: likusi dalis tenka failų podėliui. |
JavaScript programose dažnai pasikartoja vienas pikas: kompiliavimas. npm run build Next.js, Nuxt ar Angular projekte vien sau dažnai pareikalauja nuo 1 iki 2 GB, kelioms minutėms, be to, kas jau veikia. Kompiliuoti serveryje reiškia parinkti dydį šiam pikui; kompiliuoti savo kompiuteryje ar nuolatinės integracijos (CI) aplinkoje ir į serverį įkelti tik rezultatą reiškia jo išvengti.
Tas pats principas galioja Docker konteineriams: kiekvienas konteineris yra toks pat procesų rinkinys kaip ir kiti, o Docker tarnyba prideda savo suvartojimą. docker stats parodo, kiek užima kiekvienas.
Šie profiliai sudeda ankstesnes dalis, įskaitant piką ir atsargą. Jie numato įprasto dydžio programą ir paleidimo laikotarpio srautą; didelė duomenų bazė ar nuolat didelis srautas stumia skaičių aukštyn.
| Kas veikia serveryje | Reikiama atmintis |
|---|---|
| Statinė svetainė, tarpinis serveris, nedidelis botas ar suplanuotas scenarijus | nuo 1 iki 2 GB |
| WordPress svetainė su MariaDB ir puslapių podėliu | 2 GB |
| WooCommerce parduotuvė arba kelios WordPress svetainės | 4 GB |
| Node.js ar Python API su PostgreSQL, pirmieji vartotojai | 4 GB |
| Serveryje kompiliuojama Next.js programa, jos API ir PostgreSQL duomenų bazė | nuo 6 iki 8 GB |
| Kelios programos konteineriuose, testavimo ir gamybinė aplinka | 8 GB |
| Kelių dešimčių GB duomenų bazė, intensyviai naudojama | 16 GB ir daugiau |
| Serveryje vykdomas kalbos modelis su 7 ar 8 milijardais parametrų | 16 GB |
Programa, kuri DI modelį kviečia per API (OpenAI, Anthropic, Mistral), parenkama kaip bet kuri žiniatinklio programa: modelis veikia pas savo kūrėją, o jūsų serveris laukia jo atsakymo. Mastą pakeičia modelio vykdymas pačiame serveryje.
Veikiančiame serveryje vertinimą pakeičia matavimas. Trys komandos parodo, kokia yra padėtis:
free -h
ps aux --sort=-rss | head -n 15
vmstat 5 5
free -h: žiūrėkite stulpelį available, tai atmintis, iš tikrųjų prieinama naujoms programoms paleisti. Stulpelis free beveik visada rodo mažai, ir tai normalu: Linux nenaudojamą atmintį užpildo failų podėliu (buff/cache), kurį atiduoda, vos programai jos prireikia.ps aux --sort=-rss: procesai, surikiuoti pagal užimamą atmintį (stulpelis RSS, kilobaitais). Čia matyti, kiek sveria kiekvienas PHP ar Node.js darbinis procesas.vmstat 5 5: penki matavimai kas penkias sekundes. Nenulinės reikšmės stulpeliuose si ir so, matavimas po matavimo, rodo, kad serveris keičiasi duomenimis su swap: jam trūksta atminties.Matuokite labiausiai apkrautu dienos metu ir per epizodines užduotis: kompiliavimą, atsarginę kopiją, importą. Svarbus būtent pikas.
Atminties pritrūkęs serveris nelėtėja palaipsniui. Kai nebelieka ką atlaisvinti, Linux branduolys paleidžia OOM killer (out of memory): jis pasirenka procesą, paprastai daugiausia atminties užimantį, ir akimirksniu jį sustabdo. Programų serveryje tai dažnai būna duomenų bazė.
Simptomai: protarpinės klaidos 502 ar 503, paslauga, kuri be akivaizdžios priežasties persikrauna, kompiliavimas, nutrūkstantis su pranešimu Killed. Žurnalai tai patvirtina:
journalctl -k | grep -i "out of memory"
systemctl status paslaugos-pavadinimas
Komandos systemctl status išvestyje įrašas Failed with result 'oom-kill' reiškia, kad paslauga sustabdyta dėl atminties trūkumo.
Swap, jei serveris jį turi, šią akimirką atitolina, perkeldamas mažiausiai naudojamą atmintį į diską. Jis yra apsauginis tinklas, o ne talpa: serveris, nuolat besiremiantis swap, atsako kelis kartus lėčiau, net ir su NVMe SSD.
Sprendimai, nuo paprasčiausio iki ilgalaikiškiausio: sumažinti programos procesų skaičių (pm.max_children, Gunicorn darbiniai procesai), kompiliuoti ne serveryje, apriboti duomenų bazės atmintį, tada pereiti prie didesnio dydžio.
Atmintis nėra vienintelis išteklius: procesorius svarbus tam, kas skaičiuoja (kompiliavimas, vaizdų apdorojimas, DI modelio vykdymas), diskas svarbus duomenų bazei ir failams. Vis dėlto žiniatinklio programai dydį beveik visada nulemia atmintis.
VPS Pro siūlomas šešių dydžių, su Intel Xeon procesoriais, ECC atmintimi ir veidrodiniais NVMe SSD, ir bet kada pereina prie didesnio dydžio, be pakartotinio diegimo. Visapusiška pagalba įskaičiuota: aprašykite, ką veiks jūsų serveris, ir mes patarsime dydį, o paskui kiekvienu klausimu diagnozuosime ir nurodysime, ką daryti, nuo sistemos iki jūsų programos kodo.
Statinei svetainei, tarpiniam serveriui ar nedideliam scenarijui pakanka nuo 1 iki 2 GB. Kai serveryje kartu veikia duomenų bazė ir programa (PHP, Node.js, Python), skaičiuokite 2 GB WordPress svetainei ir 4 GB individualiai programai su PostgreSQL.
2 GB svetainei su MariaDB ir puslapių podėliu, 4 GB WooCommerce parduotuvei ar kelioms svetainėms. Pirmasis nustatymas yra PHP-FPM procesų skaičius: kiekvienas procesas užima nuo 40 iki 80 MB.
Ne. Swap apsaugo nuo staigaus sustojimo, kai atmintis pilna, tačiau serveris, kuris juo naudojasi nuolat, atsako kelis kartus lėčiau, net ir su NVMe SSD. Tai apsauginis tinklas; dydis renkamas pagal atmintį.
Nes Linux nenaudojamą atmintį naudoja kaip failų podėlį. Šis podėlis atlaisvinamas, vos programai prireikia atminties. Žiūrėti reikia stulpelio available, kuris rodo iš tikrųjų prieinamą atmintį.
Vien kompiliavimui skaičiuokite nuo 1 iki 2 GB, be to, kas jau veikia serveryje. Kompiliuojant savo kompiuteryje ar nuolatinės integracijos aplinkoje ir įkeliant tik rezultatą, šio piko išvengiama.
Simafri
Pakalbėkime apie jūsų sumanymą
Pasakykite mums keliais žodžiais, ko jums reikia: greitai jums atsakome.
Ačiū! Jūsų užklausa išsiųsta. Netrukus su jumis susisieksime.
Labiau mėgstate el. paštą? Rašykite mums adresu support@simafri.com.