# Teorainneacha cuimhne a shocrú le systemd agus cgroups

> systemd MemoryMax do PHP-FPM: teorainn chuimhne a shocrú trí cgroup, mar a mholann php.net do PHP2Shell, le MemoryHigh, OOMPolicy agus orduithe seiceála.

Foinse: https://phpsos.de/ga/blog/speichergrenzen-systemd-cgroups/  
Staid: 25/10/2026  
Soláthraí: PHP SOS, Cabhair éigeandála PHP agus slándáil freastalaí. Cabhair láithreach trí WhatsApp: https://wa.me/491736494914?text=Dia%20duit%2C%20a%20PHP%20SOS%2C%20t%C3%A1%20cabhair%20de%20dh%C3%ADth%20orainn%20len%C3%A1r%20bhfreastala%C3%AD%20PHP.%20Cuideachta%3A%20%E2%80%A6%20Su%C3%ADomh%20gr%C3%A9as%C3%A1in%3A%20%E2%80%A6

**Go achomair:** Do bheart idirthréimhseach PHP2Shell `memory_limit=-1` teastaíonn teorainn chuimhne ó PHP-FPM lasmuigh de PHP. Faoi systemd socraíonn tú í le `MemoryHigh=` mar bhrú agus `MemoryMax=` mar uasteorainn chrua i gcomhad forlíontach don tseirbhís FPM. Tá `ulimit`, `LimitAS=` nó `LimitDATA=` míoiriúnach chuige sin de réir php.net. Seiceáil `OOMPolicy=` freisin, ionas nach gcuireann worker aonair deireadh leis an tseirbhís ar fad.

## Moladh a chuireann ionadh ar dtús

I measc na mbeart idirthréimhseach a d'fhoilsigh php.net an 21 Deireadh Fómhair 2026 do PHP2Shell, tá ceann a chuir go leor riarthóirí ag smaoineamh: `memory_limit=-1`, is é sin gan teorainn chuimhne i PHP féin. Ar feadh blianta measadh gurbh é an rud contrártha dea-chleachtas.

Tá nasc le cur síos na leochaileachta intuigthe. I gcás CVE-2026-109618 is féidir le staid as-chuimhne PHP a idirbhriseadh agus sonraí iarratais á dtosú go páirteach amháin. Aistríonn an beart idirthréimhseach an teorainn chuimhne as PHP isteach sa chóras oibriúcháin. Ceanglaíonn php.net go sainráite é le dhá choinníoll: caithfidh an luach a bheith faoi ghlas i gcoinne scríobh os a chionn, agus caithfidh an teorainn teacht trí choimeádán nó cgroup, ní trí `RLIMIT_AS` ná `RLIMIT_DATA`.

An té nach gcuireann i bhfeidhm ach an chéad leath, tá freastalaí aige gan teorainn chuimhne ar bith. Léiríonn an t-alt seo an dara leath. Fiú le chéile fanann an beart ina idirthréimhse: ní dhúntar an leochaileacht go dtí PHP 8.5.12, 8.4.27, 8.3.36, 8.2.35 nó backport deimhnithe.

## cgroups mínithe i dhá abairt

Is feidhm d'eithne Linux iad Control Groups, cgroups mar ghearrthéarma, a ghrúpálann próisis agus a chuireann teorainn lena n-acmhainní. Cruthaíonn systemd cgroup dá chuid féin go huathoibríoch do gach seirbhís, agus baineann gach próiseas den tseirbhís, i gcás na seirbhíse FPM an máistir agus na workers go léir, léi.

Socraíonn roghanna cuimhne systemd luachanna rialaitheora cuimhne cgroup v2. An úsáideann do chóras cgroup v2, léiríonn ordú gairid:

```bash
# "cgroup2fs" ciallaíonn: tá cgroup v2 gníomhach
stat -fc %T /sys/fs/cgroup/
```

Úsáideann leaganacha reatha na ndáiltí coitianta cgroup v2 de réir réamhshocraithe. Má thaispeánann an t-ordú rud éigin eile, soiléirigh sin roimh an aistriú, mar go ndéanann doiciméadacht systemd cur síos ar na seanroghanna v1 mar seanchaite.

## systemd MemoryMax a shocrú do PHP-FPM

Téann an teorainn i gcomhad forlíontach, ar a dtugtar drop-in. Ar an gcaoi sin fanann comhad unit an phacáiste gan athrú, agus ní scríobhann nuashonrú os cionn do shocrú. Athraíonn ainmneacha seirbhíse de réir dáilte; úsáideann an sampla Debian agus Ubuntu le PHP 8.3.

```ini
# Osclaíonn eagarthóir don drop-in: sudo systemctl edit php8.3-fpm
# Toradh: /etc/systemd/system/php8.3-fpm.service.d/override.conf
[Service]
MemoryAccounting=yes
MemoryHigh=1536M
MemoryMax=2G
MemorySwapMax=0
OOMPolicy=continue
```

Na roghanna i ngearrchuntas, de réir dhoiciméadacht systemd:

| Rogha | Éifeacht | Nóta do PHP-FPM |
|---|---|---|
| `MemoryHigh=` | teorainn throttle: moillítear próisis go mór, tógtar cuimhne ar ais | an príomhlasc rialaithe, beagán faoi `MemoryMax` |
| `MemoryMax=` | teorainn absalóideach: mura féidir í a choinneáil, éiríonn an OOM-Killer gníomhach sa tseirbhís | an líne chosanta dheireanach |
| `MemorySwapMax=` | teorainn le haghaidh swap | cuireann `0` cosc ar an tseirbhís dul sa swap ina ionad |
| `OOMPolicy=` | iompar tar éis imeachta OOM: `continue`, `stop` nó `kill` | ligeann `continue` don chuid eile de na workers leanúint ar aghaidh |
| `LimitAS=`, `LimitDATA=` | rlimits in aghaidh an phróisis | míoiriúnach don bheart seo de réir php.net |

Is fiú aird speisialta a thabhairt ar `OOMPolicy=`. Le `stop` nó `kill` cuireann systemd deireadh leis an tseirbhís ar fad tar éis imeachta OOM, agus teipeann ar gach suíomh gréasáin den tseirbhís FPM sin. An luach atá i bhfeidhm gan sonrú, socraíonn réamhshocrú an chórais `DefaultOOMPolicy=` é. Seiceáil an luach éifeachtach dá bhrí sin, in ionad glacadh leis.

Ina dhiaidh sin atosaigh an tseirbhís agus cuir `memory_limit` faoi ghlas sa linn:

```bash
sudo systemctl restart php8.3-fpm
systemctl show php8.3-fpm -p MemoryHigh -p MemoryMax -p MemorySwapMax -p OOMPolicy -p MemoryCurrent
```

```ini
; Comhad linne, m.sh. /etc/php/8.3/fpm/pool.d/seite1.conf
php_admin_value[memory_limit] = -1
```

Conas a oibríonn an glasáil, déanann [php_admin_value: socruithe a chosc ar scríobh os a gcionn](https://phpsos.de/ga/blog/php-admin-value-sperren/) cur síos air.

## An luach ceart a fháil

Cruthaíonn teorainn róghann briseadh sa ghnáthoibriú, ní chosnaíonn ceann ró-fhlaithiúil mórán. Is é an t-úsáid iarbhír an pointe tosaigh.

1. Bí ag breathnú ar riachtanas cuimhne reatha gach próisis FPM thar roinnt laethanta, buaicuaireanna ualaigh san áireamh.
2. Faigh amach gá tipiciúil worker agus iolraigh é le `pm.max_children` gach linne den tseirbhís.
3. Pleanáil forlíonadh don phróiseas máistir, OPcache agus buaicphointí.
4. Socraigh `MemoryHigh=` díreach os cionn na buaicluacha tomhaiste, `MemoryMax=` le beagán spáis os a chionn.
5. Coigeartaigh luachanna tar éis seachtaine de réir na dtomhas agus imeachtaí OOM.

```bash
# Cuimhne gach próisis PHP-FPM i MB (Resident Set Size)
ps -C php-fpm8.3 -o rss= | awk '{s+=$1} END {printf "%.0f MB\n", s/1024}'
# Forbhreathnú reatha ar gach cgroup sórtáilte de réir cuimhne
systemd-cgtop -m
```

Ba cheart duit an luach do `memory_limit` a bhreacadh síos roimh an aistriú. Tar éis an nuashonraithe is féidir leat filleadh ar theorainn sheasta i PHP; conas í a roghnú go ciallmhar, tá sé ag [memory_limit a shocrú i gceart](https://phpsos.de/ga/blog/memory-limit-richtig-setzen/).

## Monatóireacht: cathain a chuireann an teorainn isteach

Is foinse chiúin earráide é teorainn chuimhne nach dtugann aon duine faoi deara nuair a spreagtar í. Comhaireann an eithne imeachtaí OOM in aghaidh cgroup, agus tugann systemd agus prótacal na heithne faoi deara iad.

```bash
# Comhaireamh OOM de cgroup na seirbhíse (cosán le cgroup v2)
cat /sys/fs/cgroup/system.slice/php8.3-fpm.service/memory.events
# Teachtaireachtaí an OOM-Killer i bprótacal na heithne
journalctl -k --since "-1 day" | grep -i "out of memory"
```

Má ardaíonn an comhaireamh `oom_kill`, cuireann an eithne deireadh le workers. Is féidir go léiríonn sé sin teorainn róghann, feidhmchlár lochtach nó iarratais neamhghnácha. Sa chás reatha is fiú imeachtaí den sórt sin a chur i gcomparáid le prótacail rochtana ag an am céanna.

> **Tábhachtach:**
> Is beart idirthréimhseach é an teorainn chuimhne agus ní chuireann sí ionad an nuashonraithe PHP. Pleanáil an nuashonrú ag an am céanna, agus atosaigh gach próiseas PHP ina dhiaidh. Tá forbhreathnú ar na bearta idirthréimhseacha go léir ag [Gníomhartha láithreacha mura féidir leat paistiú fós](https://phpsos.de/ga/php2shell/sofortmassnahmen-ohne-patch/).

Cad a tharlaíonn taobh istigh de PHP nuair a bhíonn easpa cuimhne ann, míníonn [memory_limit agus as-chuimhne](https://phpsos.de/ga/php/out-of-memory/). In Apache le mod_php baineann an teicníocht chéanna leis an tseirbhís Apache, ach roinneann PHP an teorainn leis an bhfreastalaí gréasáin féin ansin.

## Conclúid: ná déan dearmad ar an dara leath

Ní beart idirthréimhseach inchosanta é `memory_limit=-1` ach i dteannta teorainn sheachtraigh. Éascaíonn systemd an teorainn seo le cúpla líne: `MemoryHigh` mar bhrú, `MemoryMax` mar uasteorainn chrua, `MemorySwapMax` in aghaidh éalú isteach sa swap agus `OOMPolicy` roghnaithe d'aon turas. Tomhais roimh ré, bí ag faire ina dhiaidh, agus coinnigh i gcuimhne go roinneann gach linn de chuid seirbhíse an teorainn.

Thar aon rud eile: pleanáil deireadh an bhirt. Tar éis an nuashonraithe go leagan ceartaithe PHP filleann tú ar `memory_limit` seasta. Is féidir leat an teorainn cgroup a choinneáil mar chosaint bhreise in aghaidh próiseas atá ag dul as smacht.

## Conas a chabhraíonn PHP SOS go nithiúil?

- **Tomhas:** Taifeadaimid riachtanas cuimhne do sheirbhísí PHP agus díorthaímid teorainneacha oiriúnacha as.
- **Cur i bhfeidhm:** Socraímid drop-ins le `MemoryHigh`, `MemoryMax` agus `OOMPolicy` oiriúnach, cuirimid `memory_limit` faoi ghlas sa linn agus atosaímid na seirbhísí ar bhealach rialaithe.
- **Monatóireacht:** Ionchorpraímid imeachtaí OOM sa mhonatóireacht agus coigeartaímid na luachanna.
- **Chuig an bpaiste:** Tríd an [tseirbhís paistí PHP](https://phpsos.de/ga/leistungen/php-patch-service/) suiteálaimid an nuashonrú agus aisghabhaimid na luachanna idirthréimhseacha ar bhealach eagraithe ina dhiaidh.


## Ceisteanna coitianta

**Cén fáth ar cheart memory_limit a bheith ar -1? Nach bhfuil sin contúirteach?**  
Ina aonar bheadh. Molann php.net memory_limit=-1 go sainráite mar bheart idirthréimhseach i dteannta teorainn chuimhne trí choimeádán nó cgroup. Bogann an teorannú as PHP isteach sa chóras oibriúcháin mar sin. Gan an teorainn sheachtrach seo níor cheart duit an luach a shocrú.

**An féidir liom ulimit nó LimitAS= a úsáid ina n-ionad?**  
Ní féidir. Molann php.net go sainráite in aghaidh RLIMIT_AS agus RLIMIT_DATA, agus socraíonn ulimit -v, LimitAS= agus LimitDATA= na teorainneacha sin go beacht. Tugann doiciméadacht systemd le fios freisin go gcuireann LimitAS= teorainn leis an spás seoltaí, ní leis an úsáid cuimhne.

**Cad a tharlaíonn nuair a shroicheann PHP-FPM an teorainn?**  
Le MemoryHigh moillíonn an eithne na próisis agus tógann sí cuimhne ar ais. Le MemoryMax éiríonn an OOM-Killer gníomhach laistigh den tseirbhís agus cuireann sé deireadh le próiseas, worker mór den chuid is mó. An stopann an tseirbhís iomlán ina dhiaidh sin, rialaíonn OOMPolicy= é.

**An bhfuil an teorainn i bhfeidhm do gach linn ar leith?**  
Níl. Roinneann gach linn de chuid seirbhíse FPM cgroup amháin agus mar sin teorainn chomhroinnte. Teastaíonn seirbhísí FPM nó coimeádáin ar leith le haghaidh teorainneacha scartha do gach suíomh gréasáin.

**Conas a shocraím an teorainn i Docker nó i Kubernetes?**  
Tríd an teorainn cuimhne den choimeádán, mar shampla an rogha --memory le docker run nó resources.limits.memory i Kubernetes. Úsáideann an bheirt acu cgroups freisin. Fanann an prionsabal mar an gcéanna: teorainn lasmuigh de PHP, memory_limit faoi ghlas i PHP.

## Foinsí

- [systemd.resource-control (MemoryMax, MemoryHigh)](https://www.freedesktop.org/software/systemd/man/latest/systemd.resource-control.html)
- [systemd.service (OOMPolicy)](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html)
- [php.net: fógraí slándála](https://www.php.net/)
- [Lámhleabhar PHP: memory_limit](https://www.php.net/manual/en/ini.core.php)
