2012. október 4., csütörtök

Linux optimalizálása SSD-hez

  1. Első lépésként érdemes megnézni, hogy a partíciók jól lettek-e létrehozva (partition alignment megfelelő-e), de ahogy láttam a Crunchbang telepítő erre figyel, és MSDOS partíciós táblánál is (nem csak GUID Partition Table-nél, ahogy fő forrásom is írja) az első szektor 2048-nál van, ami megfelelő. Erre azért van szükség röviden, mert az SSD másképpen működik, mint a HDD: ha egy partíció nem a page size méretével osztható határon kezdődik, akkor az SSD-nek egy lap írása helyett 2 lapot kell írnia, így a sebesség és az élettartam is csökken. 25nm-es gyártási technológiánál a page size 8kB, erase block size 2MB, egy szektor 512B így kiszámolható, hogy megfelelően van eltolva a partíció.
  2. Lépés a TRIM funkció bekapcsolása. Ehhez először is 2.6.33-as vagy újabb kernellel kell rendelkezünk. Röviden a TRIM-ről: HDD esetén, ha egy fájl letörlünk, akkor az operációs rendszer az érintett szektorokat megjelöli törölhetőként és később újabb adat kiírásakor felülíródnak a korábban törölt adatok. Az SSD-nél viszont más a helyzet, mert új adatot csak üres lapokra lehet írni, törléskor azonban az operációs rendszer csak megjelöli a szektorokat törölhetőként, így azok nem tűnnek el, megjelölve továbbra is ott vannak az SSD-n. Újabb adat írásakor az erase blocknak megfelelő nagyságú részt be kell olvasni, kiírni gyorsítótárba, törölni a szükségtelen lapokat, visszaírni, majd az üres helyre az új adatokat is beírni. A TRIM egy SATA utasítás, melyet az operációs rendszer hív meg, ilyenkor ténylegesen törlődnek a szükségtelen lapok az SSD-ről. Bekapcsolásával sebességnövekedést érhetünk el.
    Ehhez az /etc/fstab fájlba kell beírnunk a discard attribútumot:
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,user_xattr,discard 0        0       2
  3.  Az előző lépéshez hasonlóan az /etc/fstab fájlban érdemes beállítani a noatime attribútumot is. Így a rendszer nem írja ki fájloknál az utolsó hozzáférés idejét, ezzel rengeteg erőforrást megspórolva.
    # / was on /dev/sda1 during installation
    UUID=8a159c3a-0867-431d-a7a1-e5211fc3a8d9 /               ext4    noatime,discard 0       1
    # /home was on /dev/sda5 during installation
    UUID=fc76149a-8a7d-43eb-a676-56ae599c440a /home           ext4    defaults,noatime,user_xattr,discard 0        0       2
  4. Az alapértelmezett IO ütemező Crunchbang-ben a CFQ (Complete Fair Queueing Scheduler), mely a HDD olvasó/író fej helyzetét is figyelembe veszi működése során. Az SSD-nél ennek nincsen értelme, így érdemes átállítani az ütemezőt Deadline, vagy Noop ütemezésre:
    printf 'ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="deadline"' | sudo tee /etc/udev/rules.d/60-ssd-scheduler.rules
  5. Néhány könyvtárat, amelyekbe nagyon gyakran történik írás, nem túl jó az SSD-n tárolni, hogy ne csökkenjen az SSD élettartama számottevően. Ezeket a könyvtárakat átmeneti fájlrendszerként érdemes felcsatolni, így ezek soha nem íródnak ki a lemezre, újraindításkor tartalmuk törlődik. Felcsatolásukhoz a /etc/fstab fájlba írjuk a következőket:
    tmpfs   /tmp       tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/log   tmpfs   defaults,noatime,mode=0755   0  0
    tmpfs   /var/spool tmpfs   defaults,noatime,mode=1777   0  0
    tmpfs   /var/tmp   tmpfs   defaults,noatime,mode=1777   0  0
    Én a két tmp könyvtárat, a napló fájlok könyvtárát, és a futásra váró folyamatok könyvtárát helyeztem át a memóriába. Ezzel a konstrukcióval érdemes vigyázni, mert ha elfogy a hely a memóriából, akkor a swap-et fogja használni a rendszer, valamint egyes programok nem tudnak elindulni, ha nincsenek meg a /var/log-ban a saját mappáik.
    Egy megoldás ezen mappák létrehozására, ha a rendszer indulásakor elkészítjük ezeket egy init.d szkriptben. Egy majdnem jó megoldás található itt, azonban hiányoznak a függőség alapú bootolást segítő LSB mezők (itt írtam róluk). Helyesen:
    sudo touch /etc/init.d/make-tmpfs-dirs
    sudo gedit  /etc/init.d/make-tmpfs-dirs
    másoljuk be a szkriptet:
    #!/bin/sh

    ### BEGIN INIT INFO
    # Provides: make-tmpfs-dirs
    # Required-Start:
    # Required-Stop:
    # Default-Start:  2 
    # Default-Stop:
    # Short-Description: Create temporary directories on tmpfs.
    # Description: Create temporary directories for Debconf, Apache2, GDM, ATD
    ### END INIT INFO

    # Debconf
    mkdir /var/cache/debconf

    # Apache2
    sudo mkdir /var/log/apache2
    sudo chown root:adm /var/log/apache2
    sudo chmod 750 /var/log/apache2
    # GDM
    sudo mkdir -p /var/log/gdm

    # ATD
    sudo mkdir -p /var/spool/cron/atjobs
    exit 0
    majd állítsuk be a jogosultságokat, és a megfelelő runlevel-t:
    sudo chmod u+x /etc/init.d/make-tmpfs-dirs
    cd /etc/rc2.d
    sudo ln -s ../init.d/make-tmpfs-dirs S02make-tmpfs-dirs
  6. A gyakori írások nem túl jók az SSD-nek, általában egy böngésző cache-eléskor legtöbbször nagyon kis fájlokat ír ki. Ezt is érdemes a memóriába áthelyezni, mert ezzel még a böngészést is gyorsíthatjuk.
    Firefox-ban a következőt kell tennünk:
  • Írjuk be a böngésző címsorába a következőt: about:config
  • Jobb klikk -> New -> String
  • Névnek írjuk be a következőt: browser.cache.disk.parent_directory
  • Értéknek pedig: /tmp 
A további SSD optimalizációval kapcsolatos eredményekről is itt fogok írni.  

6 megjegyzés:

  1. Szia,
    Jól összeszedet leírás :)
    Egy apróság amit az fstab részhez betehetnél:
    nodiratime - opció, h a könyvtárak elérési idejét se módosítsa
    body

    VálaszTörlés
    Válaszok
    1. szia,
      örülök, hogy valaki hasznát vette rajtam kívül :)
      Az fstab-os résznél, pedig nincsen szükség a "nodiratime" opcióra, mert a "noatime" erősebb feltétel és nem csak a könyvtárak, hanem a fájlok hozzáférési idejét sem írja ki, így nagyobb teljesítménynövekedés érhető el simán "noatime" opcióval! :)
      bizonyítékként érdemes megnézni az fs/inode.c fájlt, amiben a kérdéses függvény van, ami módosítja a hozzáférési időt:

      void touch_atime(struct vfsmount *mnt, struct dentry *dentry)
      {
      /* ... */
      if (inode->i_flags & S_NOATIME)
      return;
      if (IS_NOATIME(inode))
      return;
      if ((inode->i_sb->s_flags & MS_NODIRATIME) && S_ISDIR(inode->i_mode))
      return;

      látszik, hogy ha a "noatime" van beállítva már return-öl és a "nodiratime" opciót nem is vizsgálja :)

      Törlés
  2. Szia!
    Chromiumnál hogy lehet a böngésző-cachet átrakni?

    VálaszTörlés
    Válaszok
    1. Szia!

      Chromium a ~/.cache/chromium/ mappában tartja a böngésző cache-t, így például azt is fel lehet csatolni az /etc/fstab fájlban egy Tmpfs fájlrendszerként:
      tmpfs /home//.cache tmpfs noatime,nodev,nosuid,size=400M 0 0
      A cache méretét a size opcióval állíthatod be.

      Sok sikert!

      Törlés
  3. Szia!
    /boot/efi particionak lehet/kell adni discard es noatime opciokat?

    VálaszTörlés
  4. Zsenialis az leiras. Koszonet erte!

    VálaszTörlés