czwartek, marca 31, 2011

Prevent JVM from swapping

import com.sun.jna.Native;

public final class LIBC {
public static final int MCL_CURRENT = 1;
public static final int MCL_FUTURE = 2;

static {
Native.register("c");
}

public static native int mlockall(int flags);
public static native int munlockall();
private LIBC() {}
}
LIBC.mlockall(LIBC.MCL_CURRENT | LIBC.MCL_FUTURE);

On Solaris box you can do: -XX:+UseISM

środa, marca 30, 2011

Persistent HTTP with Tibco

Tibco BusinessWorks 5.6+ supports persistent HTTP connections. The only thing you must do to enable it is setting in tra file variables:

bw.plugin.http.client.usePersistentConnectionManager=true
bw.plugin.http.client.usePersistentConnectionManagerForSSL=true (5.12+)
bw.plugin.http.client.checkForStaleConnections=false

You may also find useful:

bw.plugin.http.client.maxConnectionsPerHost=[20]
bw.plugin.http.client.maxTotalConnections=[200]
bw.plugin.http.server.acceptCount=[100] # socket accept queue length
bw.plugin.http.client.ResponseThreadPool.type=single
bw.plugin.http.client.ResponseThreadPool=[10] #thread pool size for concurrent req-resp HTTP activities

Offtopic tuning tip: Engine.ThreadCount >= JDBC connection pool size and Engine.Database.TestStatement.*=select 1 from dual.



wtorek, marca 29, 2011

CMMI dla EAI

1. silosy
2. ustandaryzowana technologia
3. zoptymalizowany EAI core
4. moduły biznesowe
5. ustawicznie optymalizowane moduły biznesowe

sobota, marca 26, 2011

Cofanie licznika


Sprzedawca cccnet Jodłowno/Kolbudy k.Gdańska zapomniał, że na wysokiej jakości zdjęciach widać oryginalny przebieg.

wtorek, marca 22, 2011

EMS Traffic





Password field is functionally something between hashed and encryped value (XOR with random and shifting key):
int len = pass.length;
int lenPadded;
if(len % 16 != 0)
lenPadded = (len / 16 + 1) * 16 + 4;
else
lenPadded = len + 4;
byte pwd[] = new byte[lenPadded];
Random random = new Random(System.currentTimeMillis());
System.arraycopy(pass, 0, pwd, 4, pass.length);
for(int k = len + 4; k < lenPadded; k++)
pwd[k] = (byte)random.nextInt();

int i;
do
i = random.nextInt();
while(i == 0 || i == -1);

byte byte1 = (byte)i;
byte byte2 = (byte)(i >> 8);
pwd[0] = byte1;
pwd[1] = byte2;
pwd[2] = (byte)(len + 7777 ^ pwd[1]);
pwd[3] = (byte)(len + 7777 >> 8 ^ pwd[0]);
for(int l = 4; l < lenPadded; l++) {
byte byte0 = l % 2 == 0 ? byte1 : byte2;
pwd[l] = (byte)(pwd[l] ^ byte0);
int j = byte0 & 1;
byte0 >>= 1;
if(j != 0)
byte0 |= 128;
else
byte0 &= 127;
if(l % 2 != 0)
byte2 = byte0;
else
byte1 = byte0;
}
return pwd;
Have you noticed that keys are left in pwd at indices 0 and 1 ?!
Here is how to get password from sniffed JMS communication:
byte1 = pwd[0];
byte2 = pwd[1];
for (int z=4; z < pwd.length; z++) {
byte byte0 = z % 2 == 0 ? byte1 : byte2;
char c = (char)(byte)(pwd[z]^byte0);
if (!Character.isDefined(c))
break;
System.out.print(c);
int j = byte0 & 1;
byte0 >>= 1;
if(j != 0)
byte0 |= 128;
else
byte0 &= 127;
if(z % 2 != 0)
byte2 = byte0;
else
byte1 = byte0;
}
Damn, they could use Diffie-Hellman for these 2 keys and don't store them in the message and they would be secure! The key size of 8 bits is also a totally brilliant idea.



Session id is just a JMS message property of long type. If EMS server doesn't have proper state management per TCP/IP JMS Connection, in theory, it would be possible to hijack JMS session.

Message body goes in plain text.

Balcerowicz musi wrócić


Smutne jest to, że w następnych wyborach Polacy bezrefleksyjnie w bulu i nadzieji wybiorą tych samych... Druga myśl: głosujemy nie na kogoś, ale przeciwko, żeby tamci nie wygrali. Takie wybieranie mniejszego zła.

niedziela, marca 20, 2011

System plików a baza danych

4 miliony insertów i 2000 selektów z agregacją rozdzielone na 6 równoległych wątków komunikujących się po TCP/IP z bazą HSQLDB (tabelki cached, końcowy rozmiar 1,3GB) umiejscowioną na różnych systemach plików.


32-bitowe OpenSUSE 11.4 / 32-bitowy Solaris 11 Express, 1GB RAM, Sun Java 6.0. Czas trwania benchmarku podany w sekundach.


Wyniki znormalizowane (w procentach) względem ext4. Dwa systemy typu copy-on-write wypadają słabo - Btrfs i ZFS. ZFS-FUSE pod Linuksem radzi sobie w 4850 sekund, co relatywnie daje ok. 600%.


NilFS jest systemem plików z garbage collectorem, który może działać zbyt wolno dopuszczając do zapełnienia partycji: java.sql.BatchUpdateException: Data File size limit is reached at org.hsqldb.jdbc.JDBCPreparedStatement.executeBatch(JDBCPreparedStatement.java:1928). Wersjonowanie to fajna rzecz, ale mało powtarzalna i degradowalna z czasem wydajność sprawiają, że nie nadaje się do produkcyjnego użycia.

Wnioski: Wydajność Ext4 i XFS-a jest zbliżona, a systemy plików rozwijane przez Oracle-a (ZFS i BtrFS) są od tych linuksowych sporo wolniejsze. Miło, że z biegiem czasu natywny linuksowy system plików dogonił produkt SGI. ZFS jest fajny, ale jak widać nie we wszystkich zastosowaniach. Jedyny z w/w systemów, który umożliwia defragmentację to XFS.

niedziela, marca 13, 2011

VII. Nie kradnij

Kłamstwa

Rdz 3:1-6
A wąż był bardziej przebiegły niż wszystkie zwierzęta lądowe, które Pan Bóg stworzył. On to rzekł do niewiasty: Czy rzeczywiście Bóg powiedział: Nie jedzcie owoców ze wszystkich drzew tego ogrodu? Niewiasta odpowiedziała wężowi: Owoce z drzew tego ogrodu jeść możemy, tylko o owocach z drzewa, które jest w środku ogrodu, Bóg powiedział: Nie wolno wam jeść z niego, a nawet go dotykać, abyście nie pomarli. Wtedy rzekł wąż do niewiasty: Na pewno nie umrzecie! Ale wie Bóg, że gdy spożyjecie owoc z tego drzewa, otworzą się wam oczy i tak jak Bóg będziecie znali dobro i zło. Wtedy niewiasta spostrzegła, że drzewo to ma owoce dobre do jedzenia, że jest ono rozkoszą dla oczu i że owoce tego drzewa nadają się do zdobycia wiedzy. Zerwała zatem z niego owoc, skosztowała i dała swemu mężowi, który był z nią: a on zjadł.

Tak było na początku dziejów. Jezus też jest człowiekiem. I w ten sam sposób próbuje z nim dialogować diabeł.

Mt 4:2-11
A gdy przepościł czterdzieści dni i czterdzieści nocy, odczuł w końcu głód. Wtedy przystąpił kusiciel i rzekł do Niego: Jeśli jesteś Synem Bożym, powiedz, żeby te kamienie stały się chlebem.

Lecz on mu odparł: Napisane jest: Nie samym chlebem żyje człowiek, lecz każdym słowem, które pochodzi z ust Bożych.

Wtedy wziął Go diabeł do Miasta Świętego, postawił na narożniku świątyni i rzekł Mu: Jeśli jesteś Synem Bożym, rzuć się w dół, jest przecież napisane: Aniołom swoim rozkaże o tobie, a na rękach nosić cię będą byś przypadkiem nie uraził swej nogi o kamień.

Odrzekł mu Jezus: Ale jest napisane także: Nie będziesz wystawiał na próbę Pana, Boga swego.

Jeszcze raz wziął Go diabeł na bardzo wysoką górę, pokazał Mu wszystkie królestwa świata oraz ich przepych i rzekł do Niego: Dam Ci to wszystko, jeśli upadniesz i oddasz mi pokłon.

Na to odrzekł mu Jezus: Idź precz, szatanie! Jest bowiem napisane: Panu, Bogu swemu, będziesz oddawał pokłon i Jemu samemu służyć będziesz. Wtedy opuścił Go diabeł, a oto aniołowie przystąpili i usługiwali Mu.

A dzisiaj?

Jestem młody. Mam jeszcze sporo czasu na Kościół i te sprawy.

Mt 24:42-44
Czuwajcie więc, bo nie wiecie, w którym dniu Pan wasz przyjdzie. A to rozumiejcie: Gdyby gospodarz wiedział, o której porze nocy złodziej ma przyjść, na pewno by czuwał i nie pozwoliłby włamać się do swego domu. Dlatego i wy bądźcie gotowi, bo w chwili, której się nie domyślacie, Syn Człowieczy przyjdzie.

Mt 24:48-51
Lecz jeśli taki zły sługa powie sobie w duszy: Mój pan się ociąga,
i zacznie bić swoje współsługi, i będzie jadł i pił z pijakami,
to nadejdzie pan tego sługi w dniu, kiedy się nie spodziewa, i o godzinie, której nie zna.
Każe go ćwiartować i z obłudnikami wyznaczy mu miejsce. Tam będzie płacz i zgrzytanie zębów.

Nie muszę się aż tak angażować.

Ap 3:15-16
Znam twoje czyny, że ani zimny, ani gorący nie jesteś. Obyś był zimny albo gorący! A tak, skoro jesteś letni i ani gorący, ani zimny, chcę cię wyrzucić z mych ust.

Skoro Bóg jest miłością to wszyscy ludzie będą zbawieni.

Mt 13:39-42
Nieprzyjacielem, który posiał chwast, jest diabeł; żniwem jest koniec świata, a żeńcami są aniołowie. Jak więc zbiera się chwast i spala ogniem, tak będzie przy końcu świata. Syn Człowieczy pośle aniołów swoich: ci zbiorą z Jego królestwa wszystkie zgorszenia i tych, którzy dopuszczają się nieprawości, i wrzucą ich w piec rozpalony; tam będzie płacz i zgrzytanie zębów.

Mt 22:8-14
Wtedy rzekł swoim sługom: Uczta wprawdzie jest gotowa, lecz zaproszeni nie byli jej godni. Idźcie więc na rozstajne drogi i zaproście na ucztę wszystkich, których spotkacie. Słudzy ci wyszli na drogi i sprowadzili wszystkich, których napotkali: złych i dobrych. I sala zapełniła się biesiadnikami. Wszedł król, żeby się przypatrzyć biesiadnikom, i zauważył tam człowieka, nie ubranego w strój weselny. Rzekł do niego: Przyjacielu, jakże tu wszedłeś nie mając stroju weselnego? Lecz on oniemiał. Wtedy król rzekł sługom: Zwiążcie mu ręce i nogi i wyrzućcie go na zewnątrz, w ciemności! Tam będzie płacz i zgrzytanie zębów. Bo wielu jest powołanych, lecz mało wybranych.

Łk 13:26-28
Wtedy zaczniecie mówić: Przecież jadaliśmy i piliśmy z Tobą, i na ulicach naszych nauczałeś. Lecz On rzecze: Powiadam wam, nie wiem, skąd jesteście. Odstąpcie ode Mnie wszyscy dopuszczający się niesprawiedliwości! Tam będzie płacz i zgrzytanie zębów, gdy ujrzycie Abrahama, Izaaka i Jakuba, i wszystkich proroków w królestwie Bożym, a siebie samych precz wyrzuconych.

piątek, marca 11, 2011

Oracle w chmurze


Nie przepuszczą żadnej okazji do zrobienia kasy. Oracle Linux to tak naprawdę RedHat. Inżynierowie RedHat-a zdecydowali się ostatnio wydawać monolitycznie kod źródłowy jądra Linuksa, żeby Oracle nie mógł użyć pojedynczych patch-y na vanilla kernel.

Java 6.0 tuning

-XX:+UseFastAccessorMethods -XX:-RelaxAccessControlCheck -XX:+UseBiasedLocking -XX:+OptimizeStringConcat -XX:+UseStringCache -XX:+ConvertSleepToYield

do oszczędzenia pamięci przy używaniu stringów ASCII: -XX:-XX:+UseCompressedStrings

do zadań numerycznych: -Xcomp -Xbatch

przy dużej liczbie obiektów alokowanych krótkoterminowo: -XX:NewSize=64m -XX:NewRatio=1 -XX:+UseParallelGC -XX:+UseTLAB

przy dużej liczbie wątków: -Xconcurrentio

na Solarisie: -XX:+UseNUMA

czwartek, marca 10, 2011

Gazeta krytykuje Tuska



I tym razem nie jest to Gazeta Polska, tylko Wyborcza, zatrudniająca syna premiera. Czy teraz Gazeta Wyborcza powie Polakom, żeby głosować na liberalne SLD?

Swoją drogą najpierw byliśmy zieloną wyspą, a teraz będą nam zabierać emerytury. Ktoś tu nas robi w ... bambuko.

Staniszkis w 'Uważam Rze' powiedziała Karnowskiemu, że lepszym premierem byłby Schetyna.

środa, marca 09, 2011

Statystyki z Tibco

Statystyki procesów Tibco są w czasie zbliżonym do rzeczywistego pakowane do bazy danych. Powinien to być Oracle na bardzo silnej maszynie. Dane obrabiane są przez aplikację webową. Parę wykresów dla benchmarku EMS:


Wartości odstające od reszty to procesy z aktywnościami JMSQueueSend. Wysyłanie komunikatów odbywa się równolegle z ich odbieraniem. Wśród dużych wartości można wyodrębnić dwie grupy - bo mamy procesy wysyłające wiadomości 16k i 128k.


Średni czas między wysłaniem komunikatu JMS a odebraniem go przez proces to 100ms.


W różnicy JMSExpiration i czasu zakończenia procesu nie widać nic niepokojącego.



Jeśli tabelkę ze statystyką procesu uzupełnimy o kolumny: czas startu dzielony przez 3 minuty, 30 minut, 4 godziny, 1 doba, na których mamy indeksy to będziemy mogli zrobić szybką analizę po oknach czasowych.

czwartek, marca 03, 2011

Solaris CPU limits

Każdy rozsądny serwer produkcyjny powinien być zabezpieczony np. przed bombą forkową. Każdy ważniejszy serwer produkcyjny hostujący wiele aplikacji powinien mieć określone priorytety dla każdej z nich. W Solarisie da się zaaplikować priorytety za pomocą tzw. projektów. W pliku /etc/project możemy określić per projekt liczbę dostępnych udziałów CPU - na podstawie ich i bieżącego obciążenia maszyny dynamicznie ustalane są przez system limity na użycie CPU.


Zmiany konfiguracyjne da się zastosować bez restartu maszyny, jesteśmy wtedy ograniczeni do polecenia newtask startującego dane polecenie w ramach podanego projektu.


Domyślne dobieranie projektu dla procesu uruchomionego w kontekście danego użytkownika bazuje na wpisach user.użytkownik lub group.grupa w /etc/project. Można to zmienić przypisując projekt do użytkownika w /etc/user_attrs.