Archive for the ‘Linux’ Category

Essensielle verktøy: strace

Monday, December 4th, 2006

strace er et av de aller mest anvendelige verktøyene for en systemadministrator. Av og til sitter du og lurer på hva en prosess gjør for noe. Hvis en prosess kræsjer eller henger er det ofte veldig hjelpsomt å få greie på hva den siste fila prosessen tok i før den døde er. strace kan gjøre akkurat dette. strace kan koble seg på eksisterende prosesser og fortelle deg hvilke systemkall prosessen gjør.

Dette vises kanskje best ved et eksempel. Sett at vi har en prosess som står og tar opp skrekkelig mye CPU. Du lurer på hva den driver med. strace -p $PID kan gi deg svaret. Se her:

: [perbu@nfsd ~/tmp/foo]; strace -p 12717
Process 12717 attached – interrupt to quit
stat64(“/tmp/baz”, 0x814c0c8) = -1 ENOENT (No such file or directory)
stat64(“/tmp/baz”, 0x814c0c8) = -1 ENOENT (No such file or directory)
stat64(“/tmp/baz”, 0x814c0c8) = -1 ENOENT (No such file or directory)
^C avslutter strace. Hva ser vi? Jo – pid 12717 står og poller /tmp/baz hele tiden. Den venter tydeligvis på at noe skal dukke opp der og forfatteren av programmet forventet tydeligvis ikke at det ikke skulle være noe der og går i en altfor tett løkk rundt sjekken sin.

Et eksempel til. Sett at noen har tøyset noe til og mysql-klienten kræsjer når du forsøker å starte den. En sannsynlig årsak vil være at mysql-klienten er lenket mot feil versjon av biblioteket – libmysql. Hvis vi later som om vi ikke vet hva ldd er til så kan vi bruke strace. Faktisk kan strace avsløre lenking som ldd ikke vet om – fordi programmet laster so-filene på egen hånd – senere i programmets kjøring. Vel – uansett – slik ser det ut:

[perbu@nfsd ~/tmp/foo]; strace -e open mysql

open(“/etc/ld.so.preload”, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/lib/mysql/tls/i686/mmx/cmov/libreadline.so.4″, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/lib/mysql/tls/i686/mmx/libreadline.so.4″, O_RDONLY) = -1 ENOENT (No such file or directory)
open(“/usr/lib/mysql/tls/i686/cmov/libreadline.so.4″, O_RDONLY) = -1 ENOENT (No such file or directory)
(..)

Okey – her viser strace at programmet forsøkes lenket mot biblioteker vi ikke har installert. Dette er er helt normalt. Litt lenger ned ser vi følgende:

open(“/etc/ld.so.cache”, O_RDONLY) = 3
open(“/lib/libreadline.so.4″, O_RDONLY) = 3
open(“/lib/libncurses.so.5″, O_RDONLY) = 3
open(“/usr/lib/libstdc++.so.5″, O_RDONLY) = 3
open(“/usr/local/lib/libmysqlclient.so.6″, O_RDONLY) = 3

Her ser vi libmysql bli åpnet og lenket inn.

(..)

— SIGSEGV (Segmentation fault) @ 0 (0) —
+++ killed by SIGSEGV +++

Og her kræsjer mysql-klienten. Sett at vi har versjon 5 av mysql-klienten og strace forteller oss at den forsøker å bruke libmysql.so.6 – ikke bra. Fint, hva?

Xen Enterprise – ikke “enterprise” nok

Thursday, September 21st, 2006

Nå har jeg testet Xen Enterprise i et par dager. Jeg hadde veldig store forventninger til produktet og ble ikke så lite skuffet. Først litt om hva produktet skal gjøre.

Xen Enterprise 3.0 skal være et managment-verktøy for å Xen-basert virtualisering. Du skal temmelig enkelt kunne styre flere fysiske servere hver med mange virutelle servere på. Det skal være enkelt å installere og konfigurere virtuelle servere. Akkurat denne biten fungerer greit. Installasjon av nye servere er enkelt og Xensource har laget et par “templates” for servere basert på hhv. Debian Sarge og Redhat Enterprise Linux 4 – U1.

Problemet er først og fremst hva Xen Enterprise ikke tilbyr:

  • Det er en dårlig støtte for å rekonfigurere Xen-instansene i fart. Xen lar deg legge til CPUer, minne og disker i fart. Dette er ikke mulig i GUIet.
  • Overhodet ingen støtte for clustering. Hvis du har delt lagring så kan du med Xen gjøre morsomme ting som å flytte instanser mellom fysiske servere. Det er overhodet ingen støtte for dette i GUIet.
  • Ingen støtte for å konfigurere PCI-ressurser. Xen kan gi enkelt-instanser PCI-kort.
  • Det er fortsatt en del små feil i applikasjonen. Jeg har forsøkt å justere mengden minne på instansene uten at det ser ut til å fungere. Å legge til disker lar seg gjøre – men gui får det ikke alltid med seg.

Det siste punktet vil sikkert bli fikset relativt raskt. Det er verre med de tre andre. Når de kaller produktet sitt “Enterprise” så er dette funksjonalitet som burde være på plass – særlig i og med Xen 3.0 støtter alt dette.

Foreløpig forblir jeg ved bruk av CLI-verktøyene for å styre Xen-instansene mine. Jeg har signet opp i beta-programmet til Virtual Iron. De ser langt mer ambisiøse og jeg håper at de innfrir forventningene.

Debian Sarge –> Ubuntu Dapper

Wednesday, July 5th, 2006

Jeg har en liten virtuell server som jeg har litt tøyseting på. Den kjører Debian 3.1 – Sarge. Nå er det slik at Debian sin “stable” nesten alltid er utdatert idet den slippes – prosessen rundt det å erklære den stabil tar skrekkelig lang tid. Dermed tenkte jeg å oppgradere til Ubuntu Dapper. Dette er ikke supportert av hverken Debian eller Ubuntu som helst og erfaringene rundt omkring på nettet er ikke bare gode.

Sarge-serveren var relativt strippet. Jeg gjorde det altså slik:

  1. La til ubuntu-kilder i /etc/apt/sources.list [se lenger ned]
  2. “apt-get update”
  3. “apt-get install aptitude”. Denne vil klage over at den ikke greier å autentisere pakkene. Hvis du er paranoid så kan du legge til gpg-nøkler for hånd først.
  4. “aptitude dist-upgrade”. Denne klager også over manglende gpg-nøkler.
  5. “aptitude install ubuntu-minimal”. Denne installerer Ubuntu sine gpg-nøkler og etter dette skal apt oppføre seg ordentlig.
  6. “aptitude install debfoster && debfoster”. debfoster lager grafer av avhengigheter mellom pakkene på systemet og lar deg enkelt fjerne pakker som ikke er i bruk.

[1]: Passende “sources.list” for ubuntu:

deb http://mirror.trivini.no/ubuntu dapper main restricted universe multiverse
Forhåpenntlig vis fungerer alt. Jeg har ikke testet skrekkelig mye enda – men det meste ser ut til å ha overlevd. :-)

IPv6-problemer

Tuesday, June 27th, 2006

Midt inne i en relativt hektisk lansering oppdager vi plutselig at det å tar 10 sekunder å opprette en tcp-forbindelse mellom applikasjonstjeneren og LDAP-tjeneren. Strace – en av de beste verktøyene en i verktøyskuffen min – viser at serveren forsøker seg å bruke IPV6-adresser når den skal prate med LDAP-serveren.

Hvorfor det var slik vet jeg ikke. Jeg skulle ønske vi hadde mer tid til å grave i det – men med snarlig lansering var det lite tid til slikt. Vi svartelistet ipv6-modulen og startet om maskinen – og jammen forsvant ikke problemet. Frustrerende.

Hvordan få (flere lag) med md-enheter til å spille med LVM

Tuesday, June 20th, 2006

LVM(2) går ofte i beina på MD. LVM scanner de underliggende enhetene og da finner den selvsagt PV-iden der også. Dette kan skape mye gnøkka. Det finnes to løsninger på problemet:

  1. Bruk LVM sin MD-deteksjon. Sett md_component_detection = 1 i lvm.conf. Dette vil ikke fungere hvis du har flere lag med md (RAID10).
  2. Filtrer eksplisitt. Du må angi alle filterne på en gang. I mitt tilfelle gjorde filter = [ "a|^/dev/md4$|","r/.*/" ] susen. md4 består her av md2 og md3 – som jeg ikke vil at LVM skal rote med.

Hvordan bruke mer enn 4GB minne i en 32bits maskin.

Monday, June 19th, 2006

Å ha noe særlig over 4GB minne i en 32bits maskin bærer ikke så mye mening for de fleste applikasjoner. I og med at kjerne gjør en 3:1-split av adresserommet (3GB til hver prosess – 1GB til kjernen) kan ingen prosess nyttiggjøre seg av mer enn 3GB minne. Den mest alvorlige begrensningen er allikvel at kjernen må holde seg innenfor 1GB – dermed kan ikke Linux sin filsystemcache (den generiske page-cachen) cache noe særlig data.

Støtter maskinen amd64 eller em64t er det ikke noe problem – bruk en 64bits kjerne – men gjør den ikke det blir det litt verre.

Redhat Enterprise Linux 4 sin kjerne “hugemem” har en patch som gjør at problemet blir noe mindre – en 4GB-4GB split av adresserommet. Den krever PAE og gjør at overheaden på systemkall blir større – men resultatet er at en enkelt applikasjon kan bruke 4GB samtidig som kjernen kan bruke 4GB. Jeg er ikke 100% sikker på om page-cachen faktisk kan bruke alt minnet kjernet nå har tilgang til – jeg skal teste litt til og se hvordan det funker.

Oppdatering: Suksess! Boksen bruker nå i underkant av 2GB med minne til page-cache og 500MB til “Buffers”. Jeg kan egentlig ikke helt se hva buffers skal være nå om dagen – i og med at Linux fra og med 2.6 bare har en page-cache. LowTotal – mengden lowmem i kjernen – er nå 2GB – i motsetning til det sedvanlige 900MB.
Redhat sin kjerne lar seg nesten uten videre installeres på Ubuntu Dapper. Jeg brukte alien for å lage en deb av fila og yaird for å lage et nytt initrd. Det er selvsagt ikke like enkelt som å bare dytte inn en ferdig deb-kjerne – men det er gjørbart.

En bonus er at maskinvarestøtten til Redhat virker noe mer solid enn Debian og Ubuntu sin. Tross alt har Redhat temmelig betydelig backing fra IBM, Sun, Dell og HP – Ubuntu og Debian er ikke helt der enda.

Det hadde vært skikkelig praktisk om noen laget en Debian-install-CD med RHEL AS sine kjerne – særlig hvis denne holdes løpende oppdatert. Allerede idag merkes det at Debian Sarge er blitt litt geriatrisk av seg – å installere Sarge på splitter nye servere er ikke bare-bare.

Har vi en frivillig? :-)

Oppdatering: Det virker som om dette er gjørbart. Dokumentasjon her.