Tomcat a leaky

Při práci s Tomcatem jsme narazili na memory leaky. Tato chyba nastává při reloadu aplikace v Tomcatu. Nejčastěji se problém projevuje tak, že se zaplní část paměti heap a PermGen, která je použivaná pro načítané třídy (class).

Když tomcat načítá novou webovou aplikaci, uvolní všechny reference na původní ClassLoader a nechá GC, aby paměť uvolnil. Problém ovšem nastane, pokud na tento ClassLoader stále existuje reference. Pokud třída v rodičovském ClassLoaderu (např. část JDBC přímo v JDK) obsahuje odkaz na třídu v našem původním ClassLoaderu, a tím i přímo na na něj, nastane problém.

Problémy mohou způsobovat např. tyto knihovny:

  • JDBC DriverManager
  • Jasper (JSP compiler)
  • CGLIB – v nové verzi již opraveno

My jsme problém vyřešili tak, že v ostrém provozu Tomcat restartujeme a při vývoji jsme zvýšili paměť pro tomcat – -Xmx a
-XX:MaxPermSize=128m. Tím jsme minimalizovali riziko vzniku problému.

Více informací v článku Memory leak – classloader won’t let go.

Firemní jabber server

V poslední době jsme začali mít celkem problémy s ICQ – od změny protokolu po velmi časté odhlašování ze sítě. Proto jsme se rozhodli, že nasadíme vlastní firemní jabber server.

Použili jsme ejabberd. Instalace byla poměrně jednoduchá.

Tím jsme získali tyto výhody:

  • bezpečná komunikace po firmě – vše je šifrované a komunikace po firmě putuje jen přes náš server
  • snadnou integraci s firemním LDAP serverem – ověřování, seznam účtů a další informace z adresáře
  • sdílený seznam kontaktů – ejabberd umožňuje editovat seznam kontaktů na serveru a tak centrálně přidat nového zaměstnance.
  • JID schodné s emailovou adresou

A protože dnes používá jabber stále více lidí (také díky Google Talk), začali jsme používat jabber i na komunikaci s našimi zákazníky.

Java: Too many open files

Nedávno jsme narazili na chybu „Too many open files“ v tomcatu běžícím na našem produkčním Linuxovém serveru.

Jak jistě všichni víte v Javě se o správu paměti stará GC. Ten spustí svoji činnost ve chvíli, kdy je spotřebována paměť a je potřeba další.
Při vytvoření FileInputStream se otevře soubor (a vytvoří tzv. file descriptor). K zavření souboru dojde až ve finalizeru tohoto objektu. Finalizer je ovšem volán až ve chvíli, kdy je objekt uvolnění pomocí GC.

Pokud máte pro program přiděleno hodně paměti, nemusí být GC spuštěno dostatečně často a vyčerpá se limit současně otevřených souborů pro JVM/proces. Záludností tohoto problému je, že se objeví zčista jasna třeba i po roce provozu.

Řešení problému existuje několik:

  • explicitně volat metodu close() na FileInputStream a podobných objektech
  • zvýšit limit současně otevřených souborů příkazem ulimit -n 4000 .
    Pozn.: jádro 2.6.x má maximální zakompilovanou hodnotu 1 000 000. Případně je nutno zvýšit i celkový počet otevřených souborů v celém systému echo 512000 > /proc/sys/fs/file-max
  • docílit častější spouštění GC – třeba tak, že snížíte max heap size. Tato třetí varianta je ve většině případů nepoužitelná.

O limitech operačních systému na počet otevřených souborů se více dočtete v kapitole „Appendix A – Operating system limits“ v mé diplomové práci.

CVS nebo SVN

U nás ve firmě používáme program Subversion. Chtěl bych vám popsat několik výhod, které nás vedly k jeho použití namísto zatím běžnějšího CVS.

  • bezpečný síťový přístup i při zápisu – pro šifrovaný spojení k CVS musíte použít tunelování přes ssh a je tedy nutné, aby uživatelé měli konzolový přístup. Rozchodit takové řešení z windows lze, ale není nejsnadnější.
  • omezení přístupu – pokud chcete omezit přístup některým uživatelům nebo zamknout větev (branch) pro zápis, musíte „opatchovat“ CVS. U SVN můžete použít integrované ACL
  • hooky – volání akcí (hooků) je jasně definované a vždy běží pod stejným uživatelem jako běží server. U CVS jsme s tím občas měli problémy.
  • výpis větví a tagů – je možné se podívat na seznam větví a je dále je i strukturovat. U CVS se musíte dotazovat na soubor, který byl ve všech verzích (a přesto nemusí obsahovat některé značky a větve) a nebo používat externí nástroje jako je např. CVSQuery.
  • commity jsou atomické – commity se uloží celé a nebo vůbec. Je možné snadno získat seznam zněnených souborů při commitu.
  • TortoiseSVN – jedná se o klienta integrovaného do windows. Ten je tak snadný na používání, že jej používá i naše obchodní oddělení a všechny dokumenty tak ukládá do SVN.
  • offline přístup – i když nejste připojeni k síti, můžete zjišťovat seznam změněných souborů, seznam změn (diff) nebo se vrátit k verzi v repository.
  • jednodušší mergování – aby jste mohli mergovat u CVS, musíte vytvořit nejen větev (branch) ale i značku (tag). To vám umožňí pozdější sloučení změn zpět. Navíc před a po každém mergování je potřeba udělat další dvě značky – jedině tak můžete dohledat seznam namergovaných změn. U SVN nic takového dělat nemusíte. Jasně vídíte, kdy byla větev vytvořena a také seznam změn, které byly udělány při merge.

    Děláme jen jednu věc – při commitu namergovaných změn přidáváme komentář „merge -r 1000:2000“ (1000 až 2000 jsou čísla verzí, které mergujete). Do příštích verzí svn slibují i lepší podporu mergování (např. automatické sledování sloučených změn)

  • použítí WebDAVu – toto je jedna z méně důležitých přesto příjemných věcí. Někteří naši zákazníci neví co to repository je. Stačí jim webový přístup k souborům v SVN. Někteří ovšem SVN používají. Pro obě tyto skupiny můžeme používat stejné URL.
  • modularita ověřování – protože SVN umí fungovat přes apache, je možné využít všechny ověřovací metody, které apache podporuje. Takže můžete ověřovat oproti passwd, LDAPu, kerberovi, databázi, … Můžete si tak sjednotit ověřování a přístup ke všem podpůrným prostředkům pro vývoj ve vaší firmě.

Jako další podpůrné nástroje používáme WebSVN, ViewSVN a vlastní „hooky“ pro propojení s bug tracking systémem.

Toto jsou mé hlavní důvody proč používat SVN.

Úžasné překlady

Dnes jsme narazili na krásný překlad. Zkuste si na debianu/ubuntu spustit příkaz apt-get. Jako poslední řádek dostanete tento text:

Tato APT má schopnosti svaté krávy.

V angličtině je zde text:

This APT has Super Cow Powers.

Další libůstkou je výstup programu dd:

0+0 vstoupivších záznamů
0+0 vystoupivších záznamů

v angličtině:

0+0 records in
0+0 records out

Skenování přes web

Nedávno jsme narazili na problém, jak skenovat soubory přes web. Tvoříme informační systém formou webové aplikace a potřebujeme skenovat velké množství dokumentů.

Řešení, kdy uživatel naskenuje dokument v nějaké aplikaci, a pak jej nahraje (tzv. uploadne) na web, je nereálná. Potřebujeme rychlé oboustranné skenování s podavačem. Uživatel se nesmí zdržovat skenováním náhledu, definicí výřezu, rozlišením a barevnou hloubkou. Už vůbec by neměl být zdržován tím, že se soubor nahrává někam na internetový server.

Proto jsme začali uvažovat o nějakém jednodušším řešení (z hlediska jednoduchosti používání).
Pokračování textu Skenování přes web