Mae methiant i gychwyn OpenVPN yn aml yn dod fel cwyn am adnoddau ynghyd â chynnig ewyllysgar i godi terfyn, ac nid yw'r cynnig yn gweithio ond oddeutu hanner y tro. Mae dau gyfrifydd heb gysylltiad yn sefyll y tu ôl i'r methiannau hynny. Un yw terfyn y cnewyllyn ar nifer y tasgau sy'n eiddo i ID defnyddiwr real, ac mae'n cael ei etifeddu pan gyflawnir y broses. Y llall yw cyllideb cgroup y mae'r rheolwr gwasanaeth yn ei chymhwyso at uned a phopeth y mae'n ei fforchio. Mae darllen gwerth effeithiol pob un, ar gyfer yr uned sy'n rhedeg mewn gwirionedd, yn costio llai na dyfaliad.

Dau gyfrifydd, dau gwestiwn

LimitNPROC yw RLIMIT_NPROC o dan enw systemd, a'i uned gyfrifo yw'r ID defnyddiwr real. Mae pob proses sy'n eiddo i'r defnyddiwr hwnnw yn cyfrif yn erbyn yr un cyfanswm, gan gynnwys gwaith a gychwynnwyd gan unedau eraill, gan sesiwn fewngofnodi neu gan dasg trefnydd. Felly nid yw'r terfyn yn gap fesul gwasanaeth hyd yn oed pan gaiff ei osod y tu mewn i uned gwasanaeth, ac mae gwasanaeth sy'n fforchio cynorthwyydd ar gyfer pob cleient yn cystadlu â phopeth arall sy'n rhedeg o dan y cyfrif hwnnw. Gall tasg cron brysur o dan yr un defnyddiwr wthio uned VPN dros linell na chroesodd hi erioed ar ei phen ei hun.

TasksMax mae ganddo berchennog gwahanol: y rheolydd pids ar cgroup yr uned, sy'n cyfrif tasgau yn hytrach na phrosesau. Tasgau yw edafedd, felly gall daemon sy'n edrych yn un-edau gyda phwll gweithwyr ddefnyddio cyllideb sydd, ar yr olwg gyntaf, yn llawer mwy na'i nifer o brosesau. Mae EffectiveTasksMax yn adrodd beth mae hierarchaeth cgroup yn ei ganiatáu mewn gwirionedd ar ôl i'r tafelli rhiant ddweud eu dweud.

Pam mae'r eithriad root yn newid yr ateb

Nid yw'r cnewyllyn yn cymhwyso RLIMIT_NPROC at broses sy'n cario CAP_SYS_RESOURCE neu CAP_SYS_ADMIN, a dyna pam mae uned sy'n rhedeg fel root heb ollwng breintiau yn ymarferol heb derfyn o dan y gosodiad hwnnw. Mae'r un eithriad hwn yn esbonio'r cyngor gwrthgyferbyniol y mae pobl yn ei gyfnewid: mae codi LimitNPROC yn trwsio defnydd sydd wedi gollwng breintiau ac yn gwneud dim o gwbl i un sydd wedi aros yn freiniol. Edrychwch ar User= ac ar ba un a yw'r daemon yn newid hunaniaeth ar ôl cychwyn cyn rhoi clod neu fai i'r gosodiad hwnnw. Mae uned freiniol sy'n newid yn ddiweddarach i gyfrif heb freintiau yn syrthio yn ôl o dan y terfyn ar eiliad y newid, sy'n gwneud llinell amser y methiant yn werth ei darllen hefyd.

Mae cam y methiant yn ei gyfyngu ymhellach. Mae gwrthodiad yn ystod paratoi gweithredu, gwall fforchio a adroddir gan y daemon ei hun, a chreu tasg a wrthodwyd y tu mewn i cgroup yn cynhyrchu llinellau journal gwahanol, a dim ond un ohonynt y mae cyllideb fwy yn ei ateb.

Darllenwch y gwerthoedd effeithiol, nid rhai'r plisgyn

Mae ulimit -u plisgyn rhyngweithiol yn disgrifio'r plisgyn hwnnw. Nid yw'n disgrifio'r hyn a basiodd y rheolwr gwasanaeth i'r daemon, ac nid yw'n dweud dim am gyfrifo cgroup. Holwch yr uned yn lle hynny, gan ddefnyddio'r enw achos sy'n bodoli ar y gwesteiwr yn hytrach nag enghraifft o arweiniad.

systemctl show [email protected] -p User -p LimitNPROC -p TasksCurrent -p TasksMax -p EffectiveTasksMax
cat /proc/$(systemctl show -p MainPID --value [email protected])/limits | grep -i processes

Y tu mewn i gynhwysydd mae'r ateb angen dau ddarlleniad arall, oherwydd nid yw gwerth mewnol infinity yn disgrifio ond golygfa'r gwestai. Gofynnwch i berchennog y gwesteiwr am nenfwd pids y cynhwysydd ei hun, a chadarnhewch a all y rheolwr gwasanaeth mewnol ddirprwyo'r rheolydd hwnnw o gwbl. Ni all uned nythog ddal cyllideb na roddodd ei rhiant cgroup erioed.

Mesurwch y trwsiad a'i brofi o dan lwyth

Dewiswch rif o'r llwyth gwaith yn hytrach nag o destun y gwall. Cyfrifwch y prosesau y mae'r daemon yn eu cychwyn fesul cleient cysylltiedig neu fesul galwad cynorthwyydd, lluoswch â'r cyfedrediad y disgwylir i'r defnydd ei gynnal, ychwanegwch fylchran ar gyfer sesiynau gweinyddol, yna cymharwch y ffigur hwnnw â'r dau werth effeithiol. Mae trosiad drop-in lleol yn cadw'r newid yn adolygadwy ac yn goroesi diweddariadau pecynnau, tra mae golygu ffeil uned a gludwyd yn cuddio'r addasiad nes bod y diweddariad nesaf yn ei disodli. Ysgrifennwch yr arithmetig wrth ymyl y trosiad, oherwydd mae ar y person nesaf sy'n ei godi neu'n ei ostwng angen y tybiaethau, nid y rhif terfynol.

Mae newidiadau cyllideb yn cael eu cymhwyso wrth weithredu, felly nid yw ail-lwytho ar ei ben ei hun yn ail-feintio prosesau sydd eisoes yn rhedeg. Ailgychwynnwch yr uned trwy ei chylch bywyd arferol, gan dderbyn y toriad sesiwn, a darllenwch y cyfrifwyr eto ar yr achos newydd.

sudo systemctl daemon-reload
sudo systemctl restart [email protected]
systemctl show [email protected] -p TasksCurrent -p EffectiveTasksMax
sudo journalctl -u [email protected] -b --no-pager | tail -n 20

Yr hyn sy'n profi'r trwsiad yw uned a ailgychwynnwyd y mae ei chyfrif tasgau yn eistedd o dan y ddau nenfwd wrth gario'r llwyth a fwriadwyd, ynghyd â journal nad yw bellach yn adrodd am ddiffyg tasgau na fforchio ar yr un cam. Cadwch y rhifau cyn ac ar ôl gyda'r newid fel bod yr ymchwiliad nesaf yn dechrau o fesuriad yn hytrach nag o'r un cyngor. Os yw'r cyfrif yn dal i gyrraedd y nenfwd, roedd yr arithmetig yn anghywir yn hytrach na'r terfyn yn rhy fach ar hap, ac mae'r gwahaniaeth hwnnw'n werth ei wybod cyn yr ailgychwyn nesaf.

Erthyglau cysylltiedig