Sziasztok!
Ismét van egy problémám, és persze ismét olyan, amivel még sosem találkoztam, illetve neten se sokat taálni róla.
Adott egy szerver, ami 100 napja folyamatosan ment minden gond nélkül. Volt rajta egy awstats statisztika is. Egyik este még tökéletesen futott, másnap délelőtt meg már internal server error...
Ez még hagyjám, de mivel a többi CGI (pl postfilter) is ugyanezt a hibát adja, gyanítom nem az awstats -nak van baja.
Az apache logokban "Too many open files" jellegű hibaüzenet. Nem csak, ha a statisztikát akarják megnyitni, de még akkor is, ha PHP-ban egy sima include() fgv-t futtatnánk, akkor is ugyanez.
(24)Too many open files: couldn't set child process attributes: /usr/local/awstats/wwwroot/cgi-bin/index.php
(24)Too many open files: couldn't spawn child process: /usr/local/awstats/wwwroot/cgi-bin/awstats.pl
(24)Too many open files: cannot read directory for multi: /var/www/
Mint mondtam, folyamatosan ment 100 napig gond nélkül, és most keze lába ki van a szervernek. Ma pl az apache restart után nem állt fel, csak miután a szervert is újraindítottuk.És hát ez így minden, csak nem jó...
Akinek van vmi ötlete, nagyon megköszönném, mert tényleg nem sok dolgot találtam neten.
- 3344 megtekintés
Hozzászólások
lsof, limits
- A hozzászóláshoz be kell jelentkezni
Tippem: minden apache virtualhostnak kulon logfile-ja van, es tobb virtualhostot uzemeltetsz, mint 4-500? Ha igen, akkor a megoldas egy access, es egy errorlog file hasznalata az osszes virtualhost eseten, amit aztan logforgataskor szet tudsz dobalni egyeni file-okra.
- A hozzászóláshoz be kell jelentkezni
őőőő :S
/var/log/apache2 => 449,296,653 bájt 3540 fájlból.
Ebbe benne vannak a régebbi, már forgatott, illetve becsomagolt állományok is. Akkor lehet, hogy megpróbálok kezdeni vmit errefelé....
- A hozzászóláshoz be kell jelentkezni
Nem biztos, hogy ez a megoldas, nezd meg, hogy az apache virtualhostok hany logfile-t hasznalnak, es ha 100-200 felett van, akkor ird at oket, hogy egy file-t hasznaljanak, es probald meg ugy.
- A hozzászóláshoz be kell jelentkezni
Ez -volt- a probléma! Mostanra sikerült az az alig pár száz (...) bejegyzést módosítani, minden host egyetlen közös access illetve error log fájlt használ, így gyönörűen megy most, csak hát így hogyan fogok én statisztikát generálni? :S
----------------------------
Sebesség Teszt
- A hozzászóláshoz be kell jelentkezni
Az apache-al alapbol jar egy split-logfile nevu 10 soros perl script, ami azt csinalja, hogy a kozos logfile-t szetvalogatja virtualhostonkent kulon file-okra. Ehhez azt kell tenned, hogy megvaltoztatod az apache2.conf -ban a combined tipusu logfile szerkezetet, es beleteszel egy plussz mezot, ami tarolni fogja, hogy az adott logbejegyzes melyik virtualhosthoz tartozik:
Valahogy igy nezzen ki:
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
Az uj mezo a %v, ami a virtualhostot jelkepezi, tehat az ez utan bejegyzesre kerulo sorokban az elso bejegyzes az adott virtualhost neve lesz. Ez utan mar csak annyi a dolgod, hogy minden ejjel szetdobatod a nagy kozos logfile-t sok kicsire a split-logfile segitsegevel. Ehhez nekem at kellett allnom napi logforgatasra, de nem is gond, mert jo nagyra meghizott az access.log estere. Tehat betettem egy ilyen bejegyzest a /etc/logrotate.d/apache2 file-ba:
/var/log/apache2/*.log {
daily
rotate 365
compress
delaycompress
notifempty
create 644 root adm
sharedscripts
prerotate
cd /var/log/apache2/split && /usr/sbin/split-logfile < /var/log/apache2/access.log
endscript
postrotate
/usr/sbin/apache2ctl restart > /dev/null 2>&1
/usr/local/bin/awstatsupdate.sh
endscript
dateext
}
Ez pedig azt csinalja, hogy a /var/log/apache2/split konyvtarba letrehozza az aznap keszult logreszleteket, vhostokra szetbontva, majd miutan ez megvan, meghivja az awstatsupdate.sh file-t, ami pedig elkesziti a statisztikat. Annyi kell meg, hogy minden awstats config file-ban meg kell adnod, hogy a log eleresi utja megvaltozott. (Persze csak ha awstatsot hasznalsz, de gondolom mas statisztika keszito program eseten is szukseges ez a lepes)
Remelem sikerult segiteni, szolj ha nem jo valami.
- A hozzászóláshoz be kell jelentkezni
Igen, awstats -ot használok!
Köszi szépen, úgy néz ki, hogy jó lesz a dolog, egyedül annyi a probléma, hogy vhogyan egyesíteni kellene már meg a logokat :)
Úgy értem annyi bajom van ezzel így, hogy pl a www.domain-nev.hu illetve a domain-nev.hu külön fájlba került. Eddig is úgy működött a dolog, hogy vhostokra nem igazán volt szétszedve a log, csak domainekre.
De már így is tökéletes, és nagyon köszi! Tényleg csak ennyi "fáj" mostmár :)
Szerk: közben rájöttem, hogy ilyet az awstats is tud tán, szal valószínűleg megoldódnak a problémáim :)
----------------------------
Sebesség Teszt
- A hozzászóláshoz be kell jelentkezni
A www.domain-nev.hu es a domain-nev.hu akkor kerul csak kulon file-ba, ha a www es www nelkuli domainnek kulon vhostot adsz meg, valahogy igy:
[VirtualHost]
ServerName domain-nev.hu
...
[/VirtualHost]
[VirtualHost]
ServerName www.domain-nev.hu
...
[/VirtualHost]
Ehelyett hasznald igy:
[VirtualHost]
ServerName domain-nev.hu
ServerAlias www.domain-nev.hu
...
[/VirtualHost]
(a virtualhost bejegyzesekben kacsacsor helyett a szogletes zarojelet hasznaltam, hogy a forum motor meg tudja jeleniteni szepen)
- A hozzászóláshoz be kell jelentkezni
Az awstats tools mappájában találtam egy .pl fájlt, ami egyesíti a megadott fájlokat.
*domain.nev.* -> és így egyben fog megjelenni. Szerintem egyelőre marad ez a változat, később ha lesz időm majd lehet, hogy megoldom az általad említett módszerrel!
Még egyszer köszönöm szépen mindenkinek, aki segített a megoldásban.
----------------------------
Sebesség Teszt
- A hozzászóláshoz be kell jelentkezni
sysctl.conf állítgatás
- A hozzászóláshoz be kell jelentkezni
Mely paramétereket érdemes nézegetni?
fs.file-max = 204198
fs.file-nr = 3420 0 204198
fs.inode-state = 220518 0 0 0 0 0 0
fs.inode-nr = 220518 0
- A hozzászóláshoz be kell jelentkezni
Nem lehet, hogy van egy szerveralkalmazás, ami nem zárja le a fájlokat?
- A hozzászóláshoz be kell jelentkezni
Erre gondoltam én is, de sajnos a szerver olyan weblapokkal van tele, amikhez igazából semmi közöm sincsen. Van ennek vmi módja, hogyan tudnám ezt leellenőrizni?
Szerk.: Rájöttem egyébként, hogy hülyeséget kérdeztem! Kiírattam egy fájlba a megnyitott fájlokat. Lett is egyből egy majd 2MB-os fájlom, benne 15604 sor. Ez akkor ennyi megnyitott fájl jelentene? :o
- A hozzászóláshoz be kell jelentkezni
Onyx ötlete alapján régebben sikerült megoldani a problémát.
Nos a hiba újra előjött, most tartunk 313 domain-nél, és 943 hosztnál.
Jó pár oldal statisztikáját (stat.valami.hu) meg kellett szüntetnem. Ezzel ugye nincs annyi virtualhost bejegyzésem, és így ok. De meddig? :o
Próba képpen egy közös Apache LOG -ról szerettem volna átállni úgy, hogy domainenként külön mappában legyenek a log fájlok.
/var/log/apache2/domain1.hu/access.log
/var/log/apache2/domain1.hu/error.log
/var/log/apache2/domain2.hu/access.log
/var/log/apache2/domain2.hu/error.log
stb, stb. A hiba így is ugyanaz. (24)Too many open files
Az error.log -ban előforduló hibaüzenetek:
(24)Too many open files: could not open transfer log file
(24)Too many open files: couldn't set child process attributes
(24)Too many open files: couldn't spawn child process
Egy nagyjából félmillás szerver nehogy már ennyire legyen képes... :S
Egyébként már próbáltam másik szerveren is, és ott is ugyanez a hiba jött elő.
Bármilyen ötletet, és segítséget szívesen fogadok, előre is köszönöm.
- A hozzászóláshoz be kell jelentkezni
Tokmindegy, hogy a szerver mennyibe kerult, mert szoftveres a gond.
The kernel's out of file handles. Go to /proc/sys/kernel and look at
"file-max" as compared to "file-nr" as well as "inode-max" compared to
"inode-nr". I think "nr" is the number currently in use... but I could
swear I've seen it go higher than "max".
Anyway, the solution is just to put larger numbers in the "max" files. In
my /etc/init.d, I've got a file called "setmaxfiles.sh" that contains:
echo "4096" > /proc/sys/kernel/file-max
echo "12288" > /proc/sys/kernel/inode-max
Then, I made a symlink to it from /etc/rcS.d/S37setmaxfiles.sh so that it
will update the kernel structures every time it boots (as it goes through
single-user mode).
- A hozzászóláshoz be kell jelentkezni
Már 2.2 óta áthelyezték ide:/proc/sys/fs/
http://www.netadmintools.com/art295.html
/etc/sysctl.conf elég szekeszteni, nem kell külön script.
cat /proc/sys/fs/file-max
101062
Nekem defaultbol magasabb ertek van benne. :)
- A hozzászóláshoz be kell jelentkezni
Csak egy pelda volt, amit kiragadtam a google talaltatok kozul.
Nem is az ertek volt a fontos, hanem hogy kb. hol kell keresni.
- A hozzászóláshoz be kell jelentkezni
"Ma pl az apache restart után nem állt fel, csak miután a szervert is újraindítottuk.És hát ez így minden, csak nem jó..."
Akkor nem az apache es gyereki zabaljak fel az fd -ket, ha valoban leallat.
Ha legkozelebb ilyen tortenik, ments egy lsof kimentet,apache stop kor is, meg monsjuk most egyet.
Vagy megprobalhatod kideriteni mi kezdi el felzabalni... (lsof, vagy proc fs bongeszese manualisan)
cat /proc/sys/fs/file-nr , az elso ertek atlaga monoton novekszik ? (napok ugyan azon idoszakaiban nezve)
- A hozzászóláshoz be kell jelentkezni
Na nézegettem kicsit a rendszert! Remélem a lenti dolgok segítenek megoldani a gondot.
cat /proc/sys/fs/file-max
816792
cat /proc/sys/fs/file-nr
3420 0 816792
cat /proc/sys/fs/inode-nr
281441 0
cat /proc/sys/fs/inode-state
281410 0 0 0 0 0 0
lsof > /home/djsilas/apace_fut
20317 sor lett a fájlban
lsof > /home/djsilas/apace_nemfut
2186 sor lett, mikor lelőttem az apache2 -t.
Ezekkel az értékekkel fut az apache jelenleg.
Ötlet valakinek, hogy mi nem stimmelhet? Egyébként a fenti 816792 értéket a file-max -nak már én állítottam be.
Szerk.: Ja, és inode-max értéket én nem is találtam, nem tudom, hogy ez mit jelent...
- A hozzászóláshoz be kell jelentkezni
A sok külön apache log elég rossz ötlet. Az error logot még oké hogy szétszeded, de az access.log-ba jól elrakható a végére a servername és modlogannel szépen feldolgozható. Az apache pedig nem zárja le a file-okat, mivel ír beléjük szükség szerint. :)
- A hozzászóláshoz be kell jelentkezni