FreeBSD kernel panic: vm_thread_new: kstack allocation failed

Divacky Roman xdivac02 at stud.fit.vutbr.cz
Tue Mar 20 15:13:58 CET 2007


> 	A jak zni otazka ?
> 
> 	Kazdy novy thread vyzaduje aby pro ni kernel drzel jakousi datovou 
> strukturu. Mnozstvi pameti kernelu dostupne je vsak omezene. Po 
> vycerpani dalsi alokace mozna neni - a to dopadne prave takhle.
 
fakt jo? :) chvilku predstirejme ze jsem Dan a napisu dlouhej mail :)

takze.. FreeBSD 6.x ma 3 threadovaci knihovny

1) libkse

ta implementujes takzvane M:N threadovani coz priblizne znamena to ze v kernelu
je M threadu na ktere se mapuje N userspace threadu. cele je to divne slozite
ale v 7.x uz se v tom da vyznam. prakticky vyznam to ma v tom ze je to pomalejsi
ale ciste teoreticky by to melo setrit prave tu kernelovou pamet. rozhodne
ale tady plati ze velikost_pameti_pro_thread_stacky != N*velikost_thread_stacku

2) libthr

ta implementuje 1:1 threadovani coz je priblizne to co maji v linuxu a tak pekne
zmagorili svet ze je to jedine mozne reseni :) tady je vyzadovan kernel space stack
pro kazdy thread. srandovni je ze libthr je zoufale nezavisla na KSE a je tam
spousta duplicit. na druhou stranu libthr je vyrazne rychlejsi (z MNOHA duvodu - mimojine
ma umtx)


3) libc_r

tohle je ciste 1:M threadovani kde velikost kernelove pameti zaalokovane pro stacky je
konstatni (tj. nezavisla na poctu threadu v procesu)

6.x ma defaultni threadovaci knihovnu libkse...


> 	Vytvareni novych procesu (ktere take vyzaduje alokaci datove struktury) 
> obsahuje limity, ktere by mely omezit schopnost uzivatele vycerpat tyto 
> omezene zdroje.

nooooo.. zrovna tohle mne na fbsd dost se*e.. ty ruzne limity a vubec vetsina
hardcoded hodnot ma velikosti nekdy z 80tych let a je to cele naprd...

nezkoumal jsemto nejak moc podrobne ale u mne na workstation je 
kern.maxproc: 4068

coz je trapne...

> 	Moznost vytvaret nove thready IMHO nijak omezena neni a kazdy uzivatel 
> tak patrne nezrizenym vytvarenim movych ma moznost shora popsany panic 
> vyvolat.

no... ten panic je z vm_thread_new() ktery se pouziva pro allokaci threadu v
kernelu, coz muze a nemusi mit vubec nic spolecneho s userspace threadovanim (viz vyse)

kazopadne plati ze vm_thread_new se pouziva pri

1) alokaci procesu
2) alokaci threadu pomoci libthr
3) alokaci thread pomoci kse

kazdopadne plati ze omezeni tady JE pro vsecky pripady, sice pokazde je to omezene
jinak ale pokazde tady je

kern.threads.max_threads_per_proc: 1500

roman



More information about the Users-l mailing list