czwartek, lutego 19, 2009

Proste balansowanie WebMethods

<VirtualHost _default_:5555>
ServerName wmproxy:5555
ErrorLog /var/log/apache2/error_log_wm
TransferLog /var/log/apache2/access_log_wm

##################
ProxyPass /invoke balancer://WmInvokeCluster5555 stickysession=ssnid
<Proxy balancer://WmInvokeCluster5555>
BalancerMember http://192.168.1.208:5555/invoke route=instance0 loadfactor=50
BalancerMember http://192.168.1.219:5555/invoke route=instance1 loadfactor=50
</Proxy>

<Location /invoke >
Order Deny,Allow
Deny from all
Allow from all
</Location>
##################

##################
ProxyPass /ws balancer://WmWsCluster5555 stickysession=ssnid
<Proxy balancer://WmWsCluster5555>
BalancerMember http://192.168.1.208:5555/ws route=instance0 loadfactor=50
BalancerMember http://192.168.1.219:5555/ws route=instance1 loadfactor=50
</Proxy>

<Location /ws >
Order Deny,Allow
Deny from all
Allow from all
</Location>
##################

<Location /balancer-manager5555>
Order Deny,Allow
Deny from all
Allow from 192.168.2.0/255.255.255.0
SetHandler balancer-manager
</Location>

</VirtualHost>



Cały koncept w oparciu o zmodyfikowany Apache 2.2.10 mod_proxy.

środa, lutego 18, 2009

Jakimi fajnymi furami jeżdżą studenci EiTI




Alfa MiTo. Doktorów na takie coś nie stać, a profesorowie wolą bardziej klasyczne Toyoty Avensis.

niedziela, lutego 15, 2009

Windows 7 preferuje dyski SSD

Na obrazku ocena laptopa Acer Aspire 4530 - tylko 3,0 za HDD.

środa, lutego 11, 2009

Linux podpięty do AD

$ cat /etc/openldap/ldap.conf
TLS_REQCERT allow
host 192.168.1.1
base dc=example,dc=com

$ cat /etc/ldap.conf
host 192.168.1.1
uri ldap://ntpdc.example.com
port 389
ssl no
base dc=example,dc=com
scope sub

binddn LDAP@example.com
bindpw haslohaslo

nss_base_passwd dc=example,dc=com?sub
nss_base_shadow dc=example,dc=com?sub
nss_base_group dc=example,dc=com?sub&(objectCategory=group)
nss_map_objectclass posixAccount user
nss_map_objectclass shadowAccount user
nss_map_objectclass posixGroup user
nss_map_attribute gecos name
nss_map_attribute homeDirectory unixHomeDirectory
nss_map_attribute uniqueMember member

pam_password ad
nss_map_attribute userPassword authPassword

$ cat /etc/krb5.conf
[libdefaults]
default_realm = EXAMPLE.COM
clockskew = 300

[realms]
EXAMPLE.COM = {
kdc = ntpdc.example.com
admin_server = ntpdc.example.com
default_domain = example.com
}

[logging]
kdc = FILE:/var/log/krb5/krb5kdc.log
admin_server = FILE:/var/log/krb5/kadmind.log
default = FILE:/var/log/krb5/krb5libs.log

[domain_realm]
.example.com = EXAMPLE.COM

[appdefaults]
pam = {
debug = false
ticket_lifetime = 1d
renew_lifetime = 1d
forwardable = true
proxiable = false
minimum_uid = 1
clockskew = 300
external = sshd
use_shmem = sshd
}

$ cat /etc/samba/smb.conf
[global]
workgroup = EXAMPLE
realm = EXAMPLE.COM
preferred master = no
security = ads
encrypt passwords = true
log file = /var/log/samba/%m.log
log level = 3
dos charset = CP1250
unix charset = UTF8
display charset = UTF8
idmap gid = 10000-20000
idmap uid = 10000-20000
template homedir = /home/%D/%U
template shell = /bin/bash
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
winbind nested groups = Yes
winbind refresh tickets = yes
winbind separator = +
passdb backend = tdbsam
idmap backend = ad
winbind nss info = rfc2307

oplocks = yes
max xmit = 65535
dead time = 15
getwd cache = yes
large readwrite = no
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
load printers = no

$ cat /etc/nsswitch.conf
passwd: files winbind ldap
shadow: files windind ldap
group: files winbind ldap

$ nano /etc/pam.d/ [tab]
{auth,account,password} sufficient pam_winbind.so use_first_pass

$ net groupmap add rid=1000 ntgroup="Development" unixgroup=dev type=d
# lepiej zamiast tego nadac grupie nt atrybut gidNumber taki sam jak gid uniksowy

$ nano /etc/samba/smb.conf
[project]
comment = 'Remote project'
path = /home/dev/project
browseable = yes
read only = no
map inherit acl = no
inherit acls = no
inherit permissions = no
create mask = 664
directory mask = 775
valid users = @"EXAMPLE+Development"
admin users = @"EXAMPLE+Domain Admins"
force user = dev
force group = dev

$ cat /etc/apache2/vhosts.d/svn.conf

DAV svn
SVNPath /var/lib/svn/svnrepo
AuthBasicProvider ldap
AuthType Basic
AuthName "Subversion svnrepo repository"

AuthzSVNAccessFile /var/lib/svn/svn-acl

AuthLDAPURL ldap://192.168.1.1:389/OU=IT,dc=example,dc=com?samAccountName?sub?(objectCategory=person)
AuthLDAPBindDN "example\LDAP"
AuthLDAPBindPassword "haslohaslo"

Require valid-user

poniedziałek, lutego 09, 2009

Użytkownicy i grupy, SVG w mediawiki



Będąc leniwym można użyć Eclipse'a JEE z driverem z jdbc.postgresql.org.
Wygląda na to, że wybranie na tabelce opcji edit nie działa jeśli istnieje
autonumerowana kolumna.

Jeśli nie działa generacja PNG z SVG (w którym robimy use-case'y) to należy zajrzeć do /srv/www/htdocs/mediawiki/bin/ulimit*/sh i zrobić coś z -v $2.
Dodatkowo dla rzeczy wyeksportowanych z Visio są problemy z mime-type,
workaround to '$wgMimeDetectorCommand = 'file --brief --mime'.

czwartek, lutego 05, 2009

WebObjects - easy WebMethods development in Java

WebObjects framework provides easy way for WebMethods development using Java.
For every flow, java or adapter service existing in a IS package the framework generates Java beans covering pipeline's input and output, and packs generated classes into one jar file. So for every document used as a pipeline's input or output you get a Java class. You don't have to do complex multi-step flow mappings, you can do your job easily in Java. You operate on real Java objects, not on pipeline's keys and values. From Java you can call other services using Java objects.
All development can be done in Eclipse after importing jar file generated by WebObjects from IS package.



On the picture above you can see a Java service called abcd. It uses JDBC adapter service called invokeFb. WebObjects framework generated invokeFb_In and invokeFb_Out classes for that service. Service invokeFb exists in test.sql namespace, its input and output classes (invokeFb_In, invokeFb_Out) were generated in pkg.test.sql Java package. DataProxy.invokeService() method called with invokeFb_In object, knows exactly which service to invoke and what object should be returned.
You can generate jars for WmPublic and WmRoot and call native WM services from Java.

Under heavy load with huge documents processed by flow services it is possible to hang Integration Server - pipeline's objects have circular references and they are hard to process by Garbage Collector. One work around is to mark services as stateless, change session lifetime from 10 to 2 minutes, tune GC (concurrent mark sweep), the other is to change JVM to JRockit (but then your installation is not supported by Software AG).
With WebObjects you just call DataProxy.clear(pipeline) between getting Java input object from pipeline and putting output.
How to get and put objects? If invokeFb were a Java Service written with WebObjects you would do:

invokeFb_In in = DataProxy.unbox(pipeline, invokeFb_In.class);
invokeFb_Out out = new invokeFb_Out();
// do something with out
DataProxy.box(out);

niedziela, lutego 01, 2009

Windows Server 2008 R2 - szary i niebieski wracają





Widać wpływy Mac OS-a X w pasku zadań. Wersja systemu 6.1 powoduje, że Oracle 11g nie chce się instalować (ale wystarczy uruchomić Program compatibility na pliku Oracle Universal Installer i idzie).

wtorek, stycznia 13, 2009

Windows 7 - nic specjalnego

Zainstalowałem dzisiaj Windows 7 beta (w VMWarze). W zasadzie to taka Vista SP2, dla bajeru zmienili trochę wygląd, coś tam jest bardziej user friendly, coś tam może szybciej chodzi i tyle. Wcale nie czułem, że system chodzi tak szybko jak Windows XP.
Mam na laptopie KDE 4.1.87 i dużo bardziej mi się podoba niż Windows 7.

piątek, grudnia 19, 2008

Benchmarki VM c.d

Tym razem hostem jest laptop z procesorem AMD Athlon X2 QL-60, 2GB pamięci RAM, grafiką GeForce 9100M G a testowym systemem jest 64-bitowy Windows Server 2008 EE. Dla działającego realnie Windowsa zostały zmierzone wyniki PCMark05 w trybie oszczędzania energii (obniżenie do połowy taktowania CPU, spowolnienie grafiki itd.) i w trybie wydajności -obydwa testy wykonywane na jednym rdzeniu CPU (żeby można było porównywać wyniki maszyn wirtualnych, które raczej mają jeden VCPU) i tryb wydajności na obu rdzeniach.
V100 to VMWare Server 2.0 + 1 VCPU + W2K8 768MB RAM, V200 to ta sama konfiguracja ale na dwóch wirtualnych procesorach. VB to VirtualBox 2.1.
VM2 i VB2 to VMWare i VirtualBox z W2K8 na 1 CPU i zmniejszoną pamięcią do 512MB. Oprogramowanie do wirtualizacji było w 64-bitowych wersjach, zainstalowane na OpenSUSE 11.1 64-bit, jedna partycja / na XFS-ie.









Jakie z tego wnioski?
  • Cache'owanie systemu plików w Linuksie i Windowsie 2008 (wow) jest ładnie zrobione i jak jedno zgra się z drugim to mamy system wirtualny szybszy od rzeczywistego
  • VirtualBox gdyby miał dobre narzędzia do zarządzania mógłby być produktem serwerowym
  • Nie ma sensu wybierać Xen-a, bo wirtualizacja z patchowaniem strumienia instrukcji jest szybsza
  • Zamiast VMotion można zrobić wirtualizację usług, jeśli mamy do czynienia z WebService'ami to wystarczy Apache 2.2.10 i mod_proxy_balancer
  • Powinienem na Oracle'u 11 wystawić jako WebService'y jakieś operacje w schemacie hr i wtedy można by mieć jakieś sensowne życiowe testy



Jeśli wyeliminujemy wyniki grafiki 2D to można przyjąć, że mamy 20% spadku wydajności. Ale... 20% per CPU. Jeśli na kilkurdzeniowym serwerze mamy uruchomioną maszynę z jednym wirtualnym procesorem to... patrz przypadek 'AVG Performance 2CPU'. Powiedzmy, że ten spadek wydajności rekompensujemy sobie stawiając równolegle pare maszyn, usługa w nich uruchomiona moze być balansowana - czy teraz też będziemy mieć 20% per CPU? Pewnie więcej...

czwartek, grudnia 18, 2008

Prawie się zakochałem...



  • Ideał dziewczyny ma tytuł magistra inżyniera z informatyki na EiTI PW

  • Napisała, i to pod Windowsem, i to bardzo ładnym kodem (wszystkie formatowanie perfect, czyta się jak książkę Clancy'ego), kawałek softu sprawdzający, czy działamy węwnątrz sprzętowo akcelerowanej maszyny wirtualnej. Robi się to tak, przy wyłączonych przerwaniach: (1) czyszczenie TLB (czyli przeładowanie rejestru CR3), (2) sprawdzenie za pomocą źródła czasu TSC i operacji dostępu do pamięci, ile cykli robi procesor przy istniejącym mapowaniu adresu wirtualnego na fizyczny, (3) sprawdzenie tego samego ze wsadzeniem po środku instrukcji vmexit. Jeśli jesteśmy wewnątrz maszyny wirtualnej instrukcja wyjścia z niej spowoduje wywołanie handlera po stronie nadzorcy maszyny wirtualnej i zanim wrócimy minie sporo cykli procka. Czyli czas(3) - czas(2) będzie większy od zera.

  • Napisała rootkita, który obchodzi w/w detektor...

Gdyby jeszcze nie paliła... (nie wiem czy pali). Fajnie się ubierała na niektórych konferencjach - na czarno-biało, tak w stylu profesjonalnej hackerki.

Wracając do badań Pani Rutkowskiej, można napisać takiego rootkita, który wsadzi działający system operacyjny do maszyny wirtualnej (w locie, odpalamy rootkita i ziuum, a nawet szybciej) i z wnętrza maszyny wirtualnej nie będzie można tego wykryć. Matrix. System działa w wirtualnym świecie i nic o tym nie wie. I nie przyjdzie do niego żadna Trinity od firmy Symantec i nie powie, że to co widzi to ułuda.

Swoją drogą, czy ścigający się AMD i Intel, tworząc sprzętową wirtualizację pomyśleli o bezpieczeństwie, czy nie mieli czasu? Nie twierdzę, że HVM jest złe, bo sam na 32-bitowym Gentoo miałem 64-bitowego Solarisa, ale przy takim komercyjnym wyścigu dużych graczy o kasę*, może ktoś zapomniał zastanowić się nad bezpieczeństwem.

*technologię wirtualizacji ma EMC/VMware, Citrix, Oracle, Novell, RedHat, Sun i Microsoft (z tym, że to coś Microsoftu w wersji beta umie tylko "coś tam, coś tam" i po instalacji na moim laptopie z Athlonem X2 QL-60 blokuje sprzętową wirtualizację totalnie tak, że narzędzie od AMD mówi, że jej nie ma).

wtorek, grudnia 09, 2008

hpscan.tgz

Dzisiaj musiałem zeskanować siebie z dowodu. Mam w domu skaner HP 3530c, który jest obsługiwany przez kookę (której nie ma na Fedorze 10, ale jest na OpenSUSE 11.1) - niestety zeskanowane obrazki mają dziwnie podbitą korekcję gamma (są za jasne). Wygooglałem hpscan.tgz, rozpakowałem, pod GCC 4.3 się nie chciało skompilować, ale całe szczęscie w pakiecie była binarka. Binarka wymaga dostępu do pliku urządzenia - najprościej odpalić ją jako root. Udało się: 'Please wait, warming up...', brrrrm, brrrm, iyyyyy, 'head is returning' i mam obrazek w formacie PPM. Z tym hpscan.tgz to było tak, że dawno temu kiedy byłem piękny i młody miałem sobie kupić na imieniny skaner HP. Ale kupiłem takiej jednej Ance pierścionek i odłożyłem zakup skanera na następne imieniny. Niestety w następnym roku pojawiła się nowa seria skanerów HP niekompatybilna z Linuksem, a starych już nie było. Kupując HP 3530c byłem święcie przekonany, że skaner będzie działał mi z Linuksem (w 2001 roku chyba używałem już Gentoo). A okazało się, że no way i w wakacje męczyłem się nad programem w C, którym mógłbym coś wydobyć ze skanera. Sterowanie ruchem głowicy trochę jest do kitu (odgłosy są straszne), ale generalnie program działa. Dzisiaj Anka jest prawdpodobnie gruba i brzydka (a na pewno nosi okulary), a skaner HP 3530c nadal wygląda (po starciu kurzu) jak nowy.

środa, grudnia 03, 2008

Prosty skrypt do przyrostowego monitorowania logów

#!/bin/sh
function check_log() {
logfile="$1"
pattern="$2"
if [[ -z $pattern ]] ; then
echo "Wzorzec do wyszukiwania nie moze byc pusty"
return 1
fi
if [[ -f $logfile ]] ; then
size=`LC_ALL=C stat ${logfile} | grep Size | cut -d" " -f4 2>/dev/null`
old_size=`cat $logfile.size 2>/dev/null`
diff=`expr $size - $old_size 2>/dev/null`
if [[ -z $diff ]] ; then
diff=$size
fi
if [[ $diff -lt 0 ]] ; then
diff=$size
fi
if [[ $diff -gt 0 ]] ; then
echo "Plik zmodyfikowany, roznica $diff bajtow"
tail -c $diff $logfile | grep -A 20 -B 5 -e "${pattern}" 2>/dev/null 1> $logfile.err
cat $logfile.err
else
echo "Plik bez zmian, rozmiar $size"
fi

echo "$size" > $logfile.size
else
echo "Nie ma takiego pliku $logfile"
fi
}

logfile="/home/weblogic/bea/domains/WebPortal/servers/WebPortalServer1/logs/WebPortalServer1.out"
pattern="Exception"
check_log $logfile $pattern

wtorek, grudnia 02, 2008

Intel Core i7 i TLB

Translacja adresów wirtualnych na fizyczne jest w x86 tak zrobiona, że mamy drzewiastą strukturę tablic stron (jedna tabelka na najwyższym poziomie z elementami wskazującymi na tabelkę na drugim poziomie, a elementy w tabelce drugiego poziomu wskazują na tabelkę trzeciego poziomu, ..., w tablicy czwartego poziomu mamy odowołania do fizycznych ramek pamięci).
Pierwsza cześć adresu wirtualnego (ileś tam bitów) stanowi indeks dla pierwszej tabelki, druga część dla drugiej tabelki itd. Trick jest taki, że element w tabelce pierwszego poziomu może wskazywać na swoją tabelkę, i taka referencja do własnej tabelki może zajść 3 razy pod rząd.
Procesor bierze adres wirtualny, przechodzi po drzewku i na końcu uzyskuje adres fizyczny.
Takie chodzenie jest kosztowne dlatego pary [adres wirtualny, adres fizyczny] są cache'owane w buforze TLB. W Core i7 TLB ma cache dwupoziomowy: level 1 - 64 pozycje, level 2 - 512 pozycji, takiego dużego TLB procesory jeszcze nie miały - powinno to dać dużego kopa (i daje, co widać w benchmarkach).
Manual Intela mówi, że jeżeli ta sama fizyczna ramka pamięci jest używana w N mapowaniach, to wyczyszczenie cache'u TLB dla tej ramki powinno być wykonane N razy, czyli N razy musi być wykonana instrukcja INVLPG. Jeśli za mało razy zawołamy INVLPG, to procesor pamięta złe mapowanie i coś złego się stanie, bo użyje złego adresu pamięci fizycznej, w najlepszym przypadku BSOD. Manual mówi też, że jeśli są robione tricki z wskazywaniem elementu tablicy na swoją własną tablicę M razy, to INVLPG musi być zawołane M-1 razy. A wszyscy myśleli, że INVLPG działa raz a dobrze...

Balancer, failover i wdrożenia zero-downtime

#################################
# INSTANCJA 443
#################################
<VirtualHost _default_:443>
ServerRoot "/etc/httpd"
ProxyPass /svc balancer://svcCluster443 stickysession=JSESSIONID

<Proxy balancer://svcCluster443>
BalancerMember http://10.70.10.2:8080/svc route=instance0 loadfactor=99
BalancerMember http://10.70.10.3:8080/svc route=instance1 loadfactor=1
BalancerMember http://localhost/maintenance route=maintenance loadfactor=1 status=+H
</Proxy>

<Location /balancer-manager>
Order Deny,Allow
Deny from all
Allow from 192.168.2.33
SetHandler balancer-manager
</Location>

</VirtualHost>


Apache 2.2.10 ma bardzo fajnego wbudowanego balancera. Załóżmy, że serwowana przez nas usługa ma być uaktualniona. Zestawiamy całe środowisko na instance1 i za pomocą balance managera zmieniamy wagi instance0 i instance1 - bieżące operacje zostaną dokończone na aktywnej instancji 0, a nowe będą wykonane przez instancję 1. Całkowicie transparentnie dla użytkownika końcowego. Żeby przełączanie działało tak jak chcemy musimy tylko wyedytować plik źródłowy httpd-2.2.10/modules/proxy/mod_proxy.c i zmienić ograniczenia na lbfactor (np. na zakres 1-1000000). Apache'a konfigurujemy następująco:

./configure --prefix=/usr/local/apache_balancer --enable-static-support --enable-mods-shared=all --enable-deflate=shared --enable-logio=shared --enable-mime-magic=shared --enable-expires=shared --enable-headers=shared --enable-usertrack=shared --enable-proxy=shared --enable-proxy-connect=shared --enable-proxy-ftp=shared --enable-proxy-http=shared --enable-proxy-balancer=shared --enable-ssl=shared --enable-http --enable-rewrite=shared

Gdyby usługa na instance0 zespuła się możemy zaserwować statyczną odpowiedź o awarii serwisu, służy do tego route=maintenance ze statusem ustawionym na +H (hot standby).
Hot standby nie działa na RedHacie 5.1/5.2 i SLES 10 SP2, które mają starszego Apache'a.

czwartek, listopada 06, 2008

Obrazek prawie jak z IT Crowd


(C)2008 Andrzej S.

środa, listopada 05, 2008

WJMX i WebLogic 10

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=8888
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

service:jmx:rmi:///jndi/rmi://192.168.1.100:8888/jmxrmi

poniedziałek, października 20, 2008

A ja tam uważam, że Palikot jest OK

sobota, października 11, 2008

Logitech NX-50 i NX-20

Nie ma już w sprzedaży myszek NX-20 (rewelacyjna mała i lekka myszka do laptopa). Są zamiast nich modele NX-50. Rzucająca się w oczy rożnica jest taka, że te nowe nie mają oddzielnych kawałków plastiku na przyciski lewy, prawy. Przez to myszka musi się trochę dotrzeć, żeby mieć takie samo miękkie klikanie jak NX-20. Nową myszką NX-50 nie można już sobie świecić w nocy na czerwono, odkładając wyłączonego laptopa na miejsce - stara była optyczna, nowa jest laserowa.



NX-50 jest czarny, NX-20 srebrny. Ze starym NX-em zdarzał się problem z jeżdżeniem po wypolerowanym drewanianym biurku. Rozwiązaniem było podłożenie kartki A4.

Acer Aspire 5715

Z tym laptopem działa LiveDVD Hackett Linux, a to dzięki temu, że laptop jest jak najbardziej standardowy. Procesor dwurdzeniowy Intela T2370 2x1,73 GHz, 2x512KB cache L2, chipset 965 Express ze zintegrowaną grafiką. Matryca AU Optronics, na oko taka sama jak Quanta Display (jakiś czas temu ta pierwsza firma połączyła się z drugą). W porównaniu z LG Philips kolory są normalne - ładne i soczyste. Na czymś takim można już używać Paint Shop Pro bez zabawy z kolorymetrem.


Przy zimnym włączeniu komputera i nie rozgrzanych świetłówkach widać trochę nierównomierne podświetlenie. Wrażenie być może bardziej rzuca się w oczy z powodu ograniczoych, jak w każdym LCD typu TN, kątów widzenia.


Na zdjęciu tego aż tak nie widać, ale matryca AUO ma lepszą maksymalną jasność i lepsze kolory w porównaniu do LG Philips (ta dodatkowo ma wyregulowany kontrast [0,133 / 48%] i korekcję gamma [ 0,833 / 48%]).




Klawiatura jest biała i "cyka" jak we wszystkich Acerach. Kwestia przyzwyczajenia.
Przyciski u góry klawiatury (włącznik, WiFi, głośność) i lewy port USB mogły by być lepiej spasowane. Mamy jedno USB z prawej strony zaraz na samym początku od strony użytkownika. Z lewej strony są 2 porty USB jeden na drugim. Wsadzanie Kingstona do tego górnego grozi porysowaniem końcówki (co sprawdziłem po fakcie). Tańszym chińskim flashem można dogiąć ten port. Z lewej strony przed portami USB jest S-Video, za nimi jest RJ-45, a na samym końcu gniazdo VGA i wejście na Kensingtona. Równolegle z prawej strony mamy w tym miejscu RJ-11.
Z prawej strony mamy napęd DVD+-RW. Ma on jeszcze 3 cm do portu USB, więc nie przeszkadza w używaniu pendrive'ów. Producentem napędu jest LG. Sprzęt nie czyta plików z rocznych płyt Tesco... (nigdy więcej kupowania płyt razem z kolacją). Sprawdziłem na Acerze 4530 z Vistą i TSST, że z tą samą płytą też jest problem... Ale Acer 3690 też z TSST przeczytał płytę. Gdzie Windows nie może, tam Linuks daje radę.


Laptop nie grzeje się, wentylatorek jest bardzo cichy (bardziej już słychać dysk 160GB Hitachi, ale można mu to wybaczyć, bo jest szybki). Przy jasności ekranu 50% i włączonym WiFi Windows wytrzymuje 2h 50 minut na jednym ładowaniu baterii. Przy maksymalnie przyciemnionej matrycy są to 3 godziny.


Parę słów o głosnikach: Głośniki testuję puszczając z iTunes kawałek Evenascence "Bring me to life". Na idealnych głośnikach słychać wszystkie dźwięki, a przy maksymalnej głośności obudowa nie wpada w rezonans (hard rock rulez). W modelu 5715 zakres dźwięków jest obrobinę gorszy i mniej przestrzenny niż w 4530, ale za to obudowa nie wpada w rezonans. Całkiem prawodopodobne, że w obu modelach są te same głosniki, z tą różnicą, że w 4530 jest nad nimi dziurkowany fragment obudowy i przez to dźwięk się lepiej propaguje.

Parę słów o wydajności: laptop ma 2GB RAM-u, zainstalowany na nim Oracle 11 chodzi przyzwoicie. Pamiętam instalowanie Oracle'a 10 na Asusie A6K z Turionem TL30 -tam było słychać i czuć (co określa się stwierdzeniem "laptop Ci odlatuje"), że baza jest stawiana skryptem, tutaj - nic z tych rzeczy.
Need For Speed 6 w natywnej rozdzielczości 1280x800 chodzi (jeździ) raczej dobrze. Na sterowniku z września 2008 trzeba ustawić 'Memory' na 'high' i zrestartować system, w przeciwnym razie NFS zamiast pobocza będzie miał szare płaszczyzny w miejscu brakujących tekstur, których nie udało załadować się do pamięci.

Tak na dobrą sprawę laptop z dwurdzeniowym Intel Pentium Dual-Core jest w zasadzie wystarczający do wszystkiego, nawet dla programisty. Dlaczego Intel i sprzedawca w pięknym salonie koło Feminy wmawiają nam, że lepiej kupić Core 2 Duo T9300 z 8MB cache'u?
Zamiast coraz szybszego procesora użytkownik końcowy wolałby działającą 12 godzin baterię...

Cena laptopa Acer Aspire 5715 to około 1500 złotych. Do testów dostarczył Reset Kraków.

Update: Pod Linuksem (OpenSUSE 11) działa nawet kamera.



Powertop on linux 2.6.27-rc7 before and after enabling C1 accounting, CPU is AMD Athlon X2 QL60

USB and WiFi drivers were unloaded, every powertop's hint was executed.
And still only 2 hours with almost everything disabled comparing to 3:11h on Vista while browsing Internet.






--- kernels/linux-2.6.27-rc8/drivers/acpi/processor_idle.c 2008-09-30
00:24:02.000000000 +0200
+++ linux/drivers/acpi/processor_idle.c 2008-10-06 00:24:19.000000000 +0200
@@ -501,7 +501,7 @@
* ------
* Invoke the current Cx state to put the processor to sleep.
*/
- if (cx->type == ACPI_STATE_C2 || cx->type == ACPI_STATE_C3) {
+ if (cx->type >= ACPI_STATE_C1) {
current_thread_info()->status &= ~TS_POLLING;
/*
* TS_POLLING-cleared state must be visible before we
@@ -523,12 +523,17 @@
* Use the appropriate idle routine, the one that would
* be used without acpi C-states.
*/
+
+ t1 = jiffies;
+
if (pm_idle_save) {
pm_idle_save(); /* enables IRQs */
} else {
acpi_safe_halt();
local_irq_enable();
}
+
+ t2 = jiffies;

/*
* TBD: Can't get time duration while in C1, as resumes
@@ -538,8 +543,7 @@
* Note: the TSC better not stop in C1, sched_clock() will
* skew otherwise.
*/
- sleep_ticks = 0xFFFFFFFF;
-
+ sleep_ticks = ticks_elapsed(t1, t2);
break;

case ACPI_STATE_C2:
@@ -642,12 +646,13 @@
return;
}
cx->usage++;
- if ((cx->type != ACPI_STATE_C1) && (sleep_ticks > 0))
+ if (sleep_ticks > 0)
cx->time += sleep_ticks;

next_state = pr->power.state;

#ifdef CONFIG_HOTPLUG_CPU
+
/* Don't do promotion/demotion */
if ((cx->type == ACPI_STATE_C1) && (num_online_cpus() > 1) &&
!pr->flags.has_cst && !(acpi_gbl_FADT.flags &
ACPI_FADT_C2_MP_SUPPORTED)) {
@@ -811,8 +816,11 @@
if (!pr)
return -EINVAL;

+ /* Newer dual-core CPUs use C1E instead of C2 and C3 and
+ * usually do not have _CST definitions or PBLK entries.
+ * ACPI specification allows for that so return zero here */
if (!pr->pblk)
- return -ENODEV;
+ return 0;

/* if info is obtained from pblk/fadt, type equals state */
pr->power.states[ACPI_STATE_C2].type = ACPI_STATE_C2;
@@ -852,6 +860,11 @@
pr->power.states[ACPI_STATE_C1].type = ACPI_STATE_C1;
pr->power.states[ACPI_STATE_C1].valid = 1;
pr->power.states[ACPI_STATE_C1].entry_method =
ACPI_CSTATE_HALT;
+ snprintf(pr->power.states[ACPI_STATE_C1].desc,
ACPI_CX_DESC_LEN, "ACPI HLT");
+ if (!pr->power.states[ACPI_STATE_C1].latency)
+ pr->power.states[ACPI_STATE_C1].latency = 1;
+ if (!pr->power.states[ACPI_STATE_C1].power)
+ pr->power.states[ACPI_STATE_C1].power = 1000;
}
/* the C0 state only exists as a filler in our array */
pr->power.states[ACPI_STATE_C0].valid = 1;
@@ -1191,12 +1204,11 @@
memset(pr->power.states, 0, sizeof(pr->power.states));

result = acpi_processor_get_power_info_cst(pr);
- if (result == -ENODEV)
- result = acpi_processor_get_power_info_fadt(pr);
-
if (result)
- return result;
+ result = acpi_processor_get_power_info_fadt(pr);

+ /* No valid _CST and FADT, but C1 must be supported,
+ * so here we go */
acpi_processor_get_power_info_default(pr);

pr->power.count = acpi_processor_power_verify(pr);
@@ -1216,13 +1228,13 @@
#endif

/*
- * if one state of type C2 or C3 is available, mark this
+ * if one state of type C1(e), C2 or C3 is available, mark this
* CPU as being "idle manageable"
*/
for (i = 1; i < ACPI_PROCESSOR_MAX_POWER; i++) {
if (pr->power.states[i].valid) {
pr->power.count = i;
- if (pr->power.states[i].type >= ACPI_STATE_C2)
+ if (pr->power.states[i].type >= ACPI_STATE_C1)
pr->flags.power = 1;
}
}
@@ -1455,7 +1467,7 @@
static int acpi_idle_enter_c1(struct cpuidle_device *dev,
struct cpuidle_state *state)
{
- u32 t1, t2;
+ u32 t1, t2, elapsed;
struct acpi_processor *pr;
struct acpi_processor_cx *cx = cpuidle_get_statedata(state);

@@ -1482,7 +1494,10 @@

local_irq_enable();
cx->usage++;
-
+ elapsed = ticks_elapsed(t1, t2);
+ if (elapsed > 0)
+ cx->time += elapsed;
+
return ticks_elapsed_in_us(t1, t2);
}