# Nie sztuką jest skompilować kernela, sztuką zrobić to dobrze

## dziadu

Wiem, że z tytuły patos się przelewa ale cóż, taka godzina i taki humor mnie naszedł.

Powiem w czym problem. Kiedy wiele lat temu instalowałem pierwsze Gentoo to rozpływałem się w jego mitycznej szybkości. I fakt,szybki był. Teraz mam swoje Gentoo już dwa lata na laptopie (specyfikacja poniżej) i coraz częściej stwierdzam, że wydajność systemu leży w porównaniu z innymi, słabszymi nawet komputerami uruchomionymi na dystrybucjach binarnych. No i właśnie coś mi nie gra tutaj. Winiłbym kernela, a właściwie mój brak wiedzy, by go poprawnie skonfigurować.

Od dłuższego czasu narzekam na... RAM? I/O? Sam nie wiem. W skrócie mój system:

- Dell Vostro 1500

- Intel Core 2 Duo 2.2GHz

- 3GB Ram

- nVidia 8600GT

Czyli sprzęcik całkiem porządny a system się je...

DO tego pracuje na KDE 4.5.2, fakt, że lubię jak ładnie wygląda i pewna ilość (ale nie przesadzam z tym) efektów jest włączona, ale w końcu maszynka do najsłabszych nie należy i jeszcze może się porównywać ze sprzętem obecnym na rynku obecnie (laptop zakupiony prawie trzy lata temu).

No i teraz, kiedy tak pracuję dłużej, zdarza się, że zapycha się RAM. No i tragedia: system zaczyna mulić, dysk rzęzi, zaczyna się swapowanie, System z reguły tarci kontakt z rzeczywistością i czasem (najczęściej) zostaje mi tylko twardy reset. Czasem udaje mi się wyskoczyć do konsoli i zabić Operę (to ona pożera masakryczne ilości pamięci, ale ten problem mam już od wielu miesięcy, przeszedłem przez wiele wersji opery więc nie winiłbym ją za to - na innych kompach chodzi wybornie, choć ja mam tendencję do otwierania pierdyliona zakładek więc to też swoje pożera).

No i w czym jest problem? CPU scheduler? I/O scheduler? Coś innego? Przyznam się, czytanie dokumentacji kernela nigdy mnie nie pasjonowało i nie jestem z tym zaznajomiony. Może coś źle skompilowałem, może jakieś opcje nie są poprawnie skonfigurowane? Na tyle na ile (sprzęt oczywiście umiem skonfigurować w kernelu, totalnym idiota kernelowym nie jestem) go zoptymalizowałem i skonfigurowałem, na tyle jest.

Może jakiś ekspert, znawca, guru spojrzeć na mojego kernela i podpowiedzieć, co można zmienić (i jakieś króciutkie uzasadnienie, resztę sobie doczytam)? Porównywałem go z innymi kernelami, od osób które twierdzą, że u nich chodzi zajebiście, ale to taka krecia robota - sprawdzanie każdej linijki którą diff wskaże bywa męczące i tak naprawdę z tego natłoku informacji po chwili zapominam co przed chwilą czytałem.

Mój najświeższy plik konfiguracyjny kernela znajduje się tutaj: http://wklej.org/id/400410/

Za wszelkie wskazówki serdecznie dziękuję. Gdyby potrzeba było dodatkowych info to służę pomocą, poniżej jeszcze kilka standardowych logów.

Pozdrawiam,

dziadu

```
$ emerge --info

Portage 2.2_rc92 (default/linux/amd64/10.0/desktop/kde, gcc-4.4.4, glibc-2.12.1-r1, 2.6.35-gentoo-r10 x86_64)

=================================================================

System uname: Linux-2.6.35-gentoo-r10-x86_64-Intel-R-_Core-TM-2_Duo_CPU_T7500_@_2.20GHz-with-gentoo-2.0.1

Timestamp of tree: Mon, 11 Oct 2010 21:15:01 +0000

app-shells/bash:     4.1_p9::<unknown repository>

dev-java/java-config: 2.1.11::<unknown repository>

dev-lang/python:     2.6.6::<unknown repository>, 3.1.2-r4::<unknown repository>

dev-util/cmake:      2.8.1-r2::<unknown repository>

sys-apps/baselayout: 2.0.1::<unknown repository>

sys-apps/openrc:     0.6.3::<unknown repository>

sys-apps/sandbox:    2.3-r1::<unknown repository>

sys-devel/autoconf:  2.13::<unknown repository>, 2.68::<unknown repository>

sys-devel/automake:  1.9.6-r3::<unknown repository>, 1.10.3::<unknown repository>, 1.11.1::<unknown repository>

sys-devel/binutils:  2.20.1-r1::<unknown repository>

sys-devel/gcc:       4.4.4-r2::<unknown repository>

sys-devel/gcc-config: 1.4.1

sys-devel/libtool:   2.2.10::<unknown repository>

sys-devel/make:      3.81-r2::<unknown repository>

virtual/os-headers:  2.6.35::<unknown repository> (sys-kernel/linux-headers)

Repositories: gentoo kde kde-sunset roslin science qting-edge openrc x11 proaudio alexxy wirelay local_overlay

ACCEPT_KEYWORDS="amd64 ~amd64"

ACCEPT_LICENSE="* -@EULA"

CBUILD="x86_64-pc-linux-gnu"

CFLAGS="-march=core2 -O2 -pipe"

CHOST="x86_64-pc-linux-gnu"

CONFIG_PROTECT="/etc /usr/kde/3.5/env /usr/kde/3.5/share/config /usr/kde/3.5/shutdown /usr/root/etc /usr/share/config /var/lib/hsqldb"

CONFIG_PROTECT_MASK="/etc/ca-certificates.conf /etc/env.d /etc/env.d/java/ /etc/fonts/fonts.conf /etc/gconf /etc/gentoo-release /etc/php/apache2-php5/ext-active/ /etc/php/cgi-php5/ext-active/ /etc/php/cli-php5/ext-active/ /etc/revdep-rebuild /etc/sandbox.d /etc/splash /etc/terminfo /etc/texmf/language.dat.d /etc/texmf/language.def.d /etc/texmf/updmap.d /etc/texmf/web2c"

CXXFLAGS="-march=core2 -O2 -pipe"

DISTDIR="/usr/portage/distfiles"

FEATURES="assume-digests binpkg-logs distlocks fixlafiles fixpackages news parallel-fetch preserve-libs protect-owned sandbox sfperms strict unknown-features-warn unmerge-logs unmerge-orphans userfetch"

GENTOO_MIRRORS="http://ftp.fi.muni.cz/pub/linux/gentoo http://distfiles.gentoo.org"

LANG="pl_PL.UTF-8"

LDFLAGS="-Wl,-O1 -Wl,--as-needed"

LINGUAS="pl en"

MAKEOPTS="-j1"

PKGDIR="/usr/portage/packages"

PORTAGE_CONFIGROOT="/"

PORTAGE_RSYNC_EXTRA_OPTS="--exclude-from=/etc/portage/banned_branches"

PORTAGE_RSYNC_OPTS="--recursive --links --safe-links --perms --times --compress --force --whole-file --delete --stats --timeout=180 --exclude=/distfiles --exclude=/local --exclude=/packages"

PORTAGE_TMPDIR="/var/tmp"

PORTDIR="/usr/portage"

PORTDIR_OVERLAY="/var/lib/layman/kde /var/lib/layman/kde-sunset /var/lib/layman/roslin /var/lib/layman/science /var/lib/layman/qting-edge /var/lib/layman/openrc /var/lib/layman/x11 /var/lib/layman/pro-audio /var/lib/layman/alexxy /var/lib/layman/wirelay /usr/local/portage"

SYNC="rsync://rsync.gentoo.org/gentoo-portage"

USE="X a52 aac acl acm acpi alsa amd64 aspell bash-completion bluetooth branding bzip2 cairo cdr cli consolekit cracklib crypt cups cxx dbus dell dri dts dvd dvdr emboss encode exif fam firefox flac fortran gdbm gif gnutls gpm gtk iconv ipv6 jpeg kde kde4 kerberos laptop lcms ldap libnotify lm_sensors mad midi mikmod mmx mmxext mng modules mp3 mp4 mpeg mudflap multilib ncurses nls nptl nptlonly nsplugin ntplonly nvidia ogg opengl openmp pam pango pcre pdf perl pmu png ppds pppd python qt3support qt4 readline reflection sdl session slang spell sse sse2 ssl ssse3 startup-notification svg sysfs tcpd tiff truetype unicode usb vim-syntax vorbis x264 xcb xcomposite xml xorg xulrunner xv xvid xvmc zlib" ALSA_CARDS="hda-intel" ALSA_PCM_PLUGINS="adpcm alaw asym copy dmix dshare dsnoop empty extplug file hooks iec958 ioplug ladspa lfloat linear meter mmap_emul mulaw multi null plug rate route share shm softvol" APACHE2_MODULES="actions alias auth_basic authn_alias authn_anon authn_dbm authn_default authn_file authz_dbm authz_default authz_groupfile authz_host authz_owner authz_user autoindex cache cgi cgid dav dav_fs dav_lock deflate dir disk_cache env expires ext_filter file_cache filter headers include info log_config logio mem_cache mime mime_magic negotiation rewrite setenvif speling status unique_id userdir usertrack vhost_alias" COLLECTD_PLUGINS="df interface irq load memory rrdtool swap syslog" ELIBC="glibc" GPSD_PROTOCOLS="ashtech aivdm earthmate evermore fv18 garmin garmintxt gpsclock itrax mtk3301 nmea ntrip navcom oceanserver oldstyle oncore rtcm104v2 rtcm104v3 sirf superstar2 timing tsip tripmate tnt ubx" INPUT_DEVICES="evdev synaptics" KERNEL="linux" LCD_DEVICES="bayrad cfontz cfontz633 glk hd44780 lb216 lcdm001 mtxorb ncurses text" LINGUAS="pl en" PHP_TARGETS="php-5.2" RUBY_TARGETS="ruby18" USERLAND="GNU" VIDEO_CARDS="nvidia" XTABLES_ADDONS="quota2 psd pknock lscan length2 ipv4options ipset ipp2p iface geoip fuzzy condition tee tarpit sysrq steal rawnat logmark ipmark dhcpmac delude chaos account" 

Unset:  CPPFLAGS, CTARGET, EMERGE_DEFAULT_OPTS, FFLAGS, INSTALL_MASK, LC_ALL, PORTAGE_BUNZIP2_COMMAND, PORTAGE_COMPRESS, PORTAGE_COMPRESS_FLAGS
```

```
# lspci

00:00.0 Host bridge: Intel Corporation Mobile PM965/GM965/GL960 Memory Controller Hub (rev 0c)

00:01.0 PCI bridge: Intel Corporation Mobile PM965/GM965/GL960 PCI Express Root Port (rev 0c)

00:1a.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #4 (rev 02)

00:1a.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #5 (rev 02)

00:1a.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #2 (rev 02)

00:1b.0 Audio device: Intel Corporation 82801H (ICH8 Family) HD Audio Controller (rev 02)

00:1c.0 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 1 (rev 02)

00:1c.1 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 2 (rev 02)

00:1c.3 PCI bridge: Intel Corporation 82801H (ICH8 Family) PCI Express Port 4 (rev 02)

00:1d.0 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #1 (rev 02)

00:1d.1 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #2 (rev 02)

00:1d.2 USB Controller: Intel Corporation 82801H (ICH8 Family) USB UHCI Controller #3 (rev 02)

00:1d.7 USB Controller: Intel Corporation 82801H (ICH8 Family) USB2 EHCI Controller #1 (rev 02)

00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev f2)

00:1f.0 ISA bridge: Intel Corporation 82801HEM (ICH8M) LPC Interface Controller (rev 02)

00:1f.1 IDE interface: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) IDE Controller (rev 02)

00:1f.2 SATA controller: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA AHCI Controller (rev 02)

00:1f.3 SMBus: Intel Corporation 82801H (ICH8 Family) SMBus Controller (rev 02)

01:00.0 VGA compatible controller: nVidia Corporation G84 [GeForce 8600M GT] (rev a1)

03:00.0 Ethernet controller: Broadcom Corporation BCM4401-B0 100Base-TX (rev 02)

03:01.0 FireWire (IEEE 1394): Ricoh Co Ltd R5C832 IEEE 1394 Controller (rev 05)

03:01.1 SD Host controller: Ricoh Co Ltd R5C822 SD/SDIO/MMC/MS/MSPro Host Adapter (rev 22)

03:01.2 System peripheral: Ricoh Co Ltd R5C843 MMC Host Controller (rev 12)

03:01.3 System peripheral: Ricoh Co Ltd R5C592 Memory Stick Bus Host Adapter (rev 12)

03:01.4 System peripheral: Ricoh Co Ltd xD-Picture Card Controller (rev 12)

0c:00.0 Network controller: Intel Corporation PRO/Wireless 3945ABG [Golan] Network Connection (rev 02)
```

```
# lsmod

Module                  Size  Used by

coretemp                5638  0 

snd_seq_dummy           1614  0 

snd_seq_oss            27650  0 

snd_seq_midi_event      5740  1 snd_seq_oss

snd_seq                48119  5 snd_seq_dummy,snd_seq_oss,snd_seq_midi_event

snd_seq_device          5857  3 snd_seq_dummy,snd_seq_oss,snd_seq

snd_pcm_oss            36563  0 

snd_mixer_oss          14355  1 snd_pcm_oss

rfcomm                 31542  0 

l2cap                  34183  3 rfcomm

bluetooth              49048  2 rfcomm,l2cap

crc16                   1527  1 l2cap

nvidia              10206084  42 

snd_hda_codec_idt      55829  1 

snd_hda_intel          22931  4 

snd_hda_codec          70112  2 snd_hda_codec_idt,snd_hda_intel

iwl3945                73866  0 

snd_hwdep               5922  1 snd_hda_codec

snd_pcm                68195  4 snd_pcm_oss,snd_hda_intel,snd_hda_codec

snd_timer              18633  3 snd_seq,snd_pcm

iwlcore                86150  1 iwl3945

dell_laptop             6242  0 

mac80211              134629  2 iwl3945,iwlcore

cfg80211              133749  3 iwl3945,iwlcore,mac80211

rfkill                 16403  3 bluetooth,dell_laptop,cfg80211

uvcvideo               51892  0 

sdhci_pci               6746  0 

dcdbas                  6105  1 dell_laptop

b44                    25119  0 

videodev               39906  1 uvcvideo

v4l1_compat            12124  2 uvcvideo,videodev

v4l2_compat_ioctl32     9321  1 videodev

snd                    58062  18 snd_seq_dummy,snd_seq_oss,snd_seq,snd_seq_device,snd_pcm_oss,snd_mixer_oss,snd_hda_codec_idt,snd_hda_intel,snd_hda_codec,snd_hwdep,snd_pcm,snd_timer

snd_page_alloc          7069  2 snd_hda_intel,snd_pcm
```

----------

## SlashBeast

Brzmi jakbys mial swappiness na zero i w momencie gdy konczy sie ram wpadasz w nagle swappowanie. pokaz sysctl vm.swappiness

Dodatkowo, napisz jak masz porobione partycje i jaki system plikow tam posiadasz.

Dobrym pomyslem moze byc na test zrobienie kernela z BFQ* i BFS**

dorzuc do sysctl.conf:

```
vm.dirty_bytes=157286400

vm.dirty_background_bytes=52428800

vm.swappiness=20

vm.vfs_cache_pressure=50
```

 I rebootni badz przeladuj sysctl i sprwadz, jak system bedzie smigal.

* http://algo.ing.unimo.it/people/paolo/disk_sched/sources.php

** http://www.kernel.org/pub/linux/kernel/people/ck/patches/2.6/2.6.35/2.6.35-ck1/patches/2.6.35-sched-bfs-323.patch

A co do samego kernela:

- wlacz config_no_hz (dynticks)

- zmien config_hz z 100 na 250Hz

- Przygotuj dwa kernele - jeden z pelnym preemptem, drugi bez preempta (server). Ja osobiscie wole bez preempta. Aktualnie masz PREEMPT_VOLUNTARY ktory sie do niczego nie nadaje.

- Zmien CONFIG_SLAB na CONFIG_SLUB (w sekcji general chyba).

- Wlacz CONFIG_HIGH_RES_TIMERS

----------

## dziadu

Dzięki Slash, po pracy przetestuję Twoje propozycje. Puki co, garść dodatkowych informacji:

```
# grep -vE '^(#|$)' /etc/sysctl.conf 

net.ipv4.ip_forward = 1

net.ipv4.ip_dynaddr = 1

net.ipv4.conf.default.rp_filter = 1
```

```
# sysctl vm.dirty_bytes

vm.dirty_bytes = 0

# sysctl vm.dirty_background_bytes

vm.dirty_background_bytes = 0

# sysctl vm.swappiness

vm.swappiness = 60

# sysctl vm.vfs_cache_pressure

vm.vfs_cache_pressure = 100
```

----------

## SlashBeast

Domyslnie vm.dirty jest w procentach (vm.dirty.ratio chyba) i jest to 20%, co imo jest dobre, jak masz 512M ramu badz mniej.

----------

## dziadu

Zapomniałem jeszcze o fstab:

```
/dev/sda2               /boot           ext2            noatime         1 2

/dev/sda5               /               reiserfs        noatime         0 1

/dev/sda6               /home           reiserfs        noatime         0 2

/dev/sda7               none            swap            sw              0 0

/dev/sda3               /mnt/sda3       ntfs            users,rw,umask=0000     0 0

/dev/sda8               /mnt/sda8       vfat            users,rw,umask=0000     0 0

shm                     /dev/shm        tmpfs           nodev,nosuid,noexec     0 0
```

Swap ma 518MB.

----------

## SlashBeast

Jakas poprawa?

----------

## Belliash

Ja bym Ci jeszcze polecil migracje / na np ext4. Z wlasnego doswiadczenia moge powiedziec, ze reiserfs sie cholernie szybko fragmentuje, co znacznie spowalnia odczyt/zapis danych na dysku. Ogolnie jak uzywalem tego FS to juz po ok miesiacu bylo widac spowolnienie. Odkad migrowalem do ext4, nie mam tego problemu.

----------

