KVM i task blocked for more than 120 seconds – solved

Sprawę miałem opisać już jakiś czas temu i zapomniałem, a jest szansa, że komuś się przyda. Był sobie serwer, na którym działało trochę VPSów. Wszystkie KVM, wszystkie z systemem plików ext4 i obrazem dysku qcow2. Czyli standard. Sprzęt nie pierwszej młodości, ale działały względnie stabilnie. Poza jedną, w sumie najbardziej obciążoną, bo działał w niej jeden z serwerów Zabbixa. Niespecjalnie obciążony w porównaniu z innymi, w których jednak żaden nie działał w KVM.

Tej jednej zdarzał się zaliczyć zwis, z komunikatami dotyczącymi KVM i task blocked for more than 120 seconds:

kernel: INFO: task XXX blocked for more than 120 seconds.kernel: "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.

Wymagany był reboot wirtualki. Dotyczyło to różnych tasków, a całość działa się losowo. Potrafiło działać przez kilka tygodni, a potrafiło wywalić się co parę dni, co nie ułatwiało diagnostyki. Początkowo działo się to na tyle rzadko, że sprawa została zignorowana. Jedkal w miarę wzrostu obciążenia maszyny fizycznej, problem się nasilał. Objaw był taki, że operacje wymagające zapisu na dysk nie wykonywały się (czyli monitoring zdychał). Zacząłem szukać przyczyn. Pierwotnie podejrzenie padło na coś, co wykonuje się z crona, bo sporo procesów crona wisiało. Jedak przejrzenie skryptów pokazało, że niespecjalnie mogą one być przyczyną

Wyglądało, jakby momentami coś nie wyrabiało się dostępem do dysków w momentach większego obciążenia. Z tym, że znowu – widać było, że nie jest to deterministyczne. Ponieważ maszyny jak wspomniałem starawe, to podejrzenie padło na sprzęt – problemy z dostępem do dysków potrafią robić cuda. SMART pokazywał, że wszystko OK, ale sprawdzić nie zawadzi… Przeniesienie wirtualki na inną, mniej obciążoną maszynę fizyczną nie przyniosło rezultatów – wieszało się nadal, chociaż rzadziej.

Oczywiście wyłączenie komunikatu, które jest w nim wspomniane, nie rozwiązuje problemu. W międzyczasie trafiłem na opis rozwiązania problemu KVM task blocked, czyli zmniejszenie vm.dirty_ratio oraz vm.dirty_backgroud_ratio. Tylko że… to nie pomogło. Nie pomogło także zwiększenie kernel.hung_task_timeout_secs początkowo do 180, potem do 300 sekund. Było trochę lepiej, ale problem nadal występował. Pół żartem, pół serio zacząłem się zastanawiać nad automatycznym rebootem po wystąpieniu problemu (zawsze to krótsza przerwa), ale to brzydkie obejście, nie rozwiązanie. Tym bardziej, że w miarę wzrostu obciążenia i VPSa, i maszyny fizycznej na której on działał, problem zaczął występować częściej. Góra co parę dni. Paradoksalnie, dobrze się stało, bo i motywacja większa, i sprawdzanie efektu wprowadzonych zmian łatwiejsze.

Z braku opisów w sieci, pomocy znajomych adminów i innych pomysłów zacząłem sprawdzać po kolei wszystko. Od fsck systemu plików, przez nowsze wersje kernela, zarówno na maszynie fizycznej, jak i na wirtualce – a nuż coś poprawili. Bez rezultatu. Ostatecznie postanowiłem zmienić format dysku wirtualki z qcow2 na raw i… trafiony, zatopiony – wirtualka zaczęła działać stabilnie.

Dla pewności wróciłem jeszcze z raw z powrotem na qcow2, na wypadek, gdyby chodziło o jakieś błędy, których nie wykrywało narzędzie do sprawdzania qcow2, ale… problem natychmiast wrócił. Gwoli ścisłości: ww. tuning dotyczący parametrów kernela z serii vm.dirty został zachowany.

Jak przenieść aplikację na kartę SD w systemie Android? HOWTO

Na jednym starym urządzeniu z Androidem mam śmieszną ilość wbudowanego dysku w urządzeniu – poniżej 512 MB. Do tego wydawało mi się, że aplikacje ze sklepu Google Play mogą być instalowane tylko na wbudowanym flash w urządzenie. Dziś dowiedziałem się, jak zmusić Androida (przynajmniej poniżej wersji 5) do instalacji oprogramowania bezpośrednio na karcie SD. Operacja jest umiarkowanie prosta, więc jeśli ktoś ma problem z brakiem miejsca na telefonie, to polecam. Co zdziwiło mnie najbardziej to fakt, że nie jest konieczne rootowanie telefonu. Zatem jak przenieść aplikację na kartę?

Wymagania

Aby odblokować możliwość przenoszenia praktycznie dowolnego oprogramowania na kartę SD, potrzebne będą:

  • kabel USB do połączenia telefonu i komputera,
  • Android w wersji niższej niż 5,
  • włączenie USB debugging na urządzeniu na czas zmiany ustawień,
  • oprogramowanie Android Debug Bridge (ADB) zainstalowane na komputerze (w przypadku Linuksa powinno być w repozytoriach).

Odblokowanie przenoszenia aplikacji na kartę SD

  • upewniamy się, że tryb USB debugging jest włączony lub włączamy go,
  • podłączamy urządzenie do komputera,
  • sprawdzamy, czy jest widoczne (polecenie adb devices),
  • jeśli jest widoczne, wydajemy polecenie adb shell,
  • w powstałej konsoli wydajemy polecenie pm get-install-location – zapewne zobaczymy 0 lub 1, co oznacza odpowiednio wybór automatyczny lub wewnętrzną pamięć flash,
  • zmieniamy wartość na 2: pm set-install-location 2,
  • zamykamy konsolę adb, odpinamy telefon od komputera, wyłączamy USB debugging.

Przenoszenie programów na kartę SD

  • na telefonie wybieramy Ustawienia -> Aplikacje -> Na karcie SD,
  • „ptaszek” przy nazwie programu oznacza, że jest on na karcie SD,
  • wybieramy kolejno aplikacje i w ich ustawieniach wybieramy przenieś na kartę SD.

Po chwili powinniśmy zauważyć przyrost wolnego miejsca na wbudowanym w urządzenie nośniku.

Wady

Poza oczywistą zaletą, czyli możliwością instalacji większej ilości programów, co często oznacza być albo nie być dla urządzenia, są też wady:

  • wbudowana pamięć flash jest zwykle szybsza, niż karta, ale w praktyce nie odczuwam tego, na typowej lowendowej karcie,
  • niektóre aplikacje, zwł. systemowe lub Google nadal nie dają się przenieść,
  • przenoszone aplikacje zajmują nadal trochę miejsca na wewnętrznej pamięci.

Na zakończenie polecam lekturę pełniejszego opisu, z obrazkami (ang.) opisującego jak przenieść aplikację na kartę. Widziałem kilka opisów, ale ten wydaje mi się najlepszy i najbardziej przystępny.

UPDATE

Debugowanie USB w Androidzie 4.2 i nowszych

W przypadku Androida w wersji 4.2 i nowszych, nie można tak zwyczajnie włączyć debugowania USB. Należy najpierw odblokować ukryte menu, a żeby to zrobić należy zostać programistą.
Wybieramy Ustawienia -> System -> Informacje o urządzeniu -> O telefonie i naciskamy 7 razy (nie, to nie jest żart). Po tym otrzymujemy informację, że zostaliśmy programistą. Następnie standardowo w Opcje programisty wybieramy Debugowanie USB.

Let’s encrypt i lighttpd – HOWTO

Czym jest Let’s Encrypt wie już chyba każdy, kogo interesują certyfikaty SSL. Wypada jednak jakieś wprowadzenie napisać, więc: to prosty sposób na odnawialne automatycznie, rozpoznawane przez przeglądarki, bezpłatne certyfikaty SSL dla każdego. Projekt jest w fazie public beta, więc przystąpić może każdy. Stoją za nim duzi (przykładowi, bardziej znani sponsorzy: Mozilla, EFF, Cisco, OVH, Google Chrome, Facebook), więc raczej coś z tego będzie. Jest krokiem w kierunku zwiększania bezpieczeństwa w sieci pod hasłem wszystko po HTTPS. Które to rozwiązanie ma wady, ale o tym już było.

Let's Encrypt logo

Źródło: https://letsencrypt.org/trademarks/

Ponieważ właśnie dostałem maila od Let’s Encrypt, że wygenerowany przez nich, darmowy certyfikat SSL dla mojej domeny wygasa, postanowiłem skorzystać z największego dobrodziejstwa, czyli zautomatyzować całość. Prosty skrypt, który zadziała dla lighttpd i jednej domeny:

#!/bin/bash LECMD="/opt/bin/letsencrypt/letsencrypt-auto"DOMAIN="mojadomena.com"WEBROOT="/var/www/mojadomena.com/html/"EMAIL="adres@email"$LECMD --renew-by-default -a webroot --webroot-path $WEBROOT --server https://acme-v01.api.letsencrypt.org/directory --email $EMAIL --text --agree-tos -d $DOMAIN authcat /etc/letsencrypt/live/$DOMAIN/privkey.pem /etc/letsencrypt/live/$DOMAIN/cert.pem > /etc/letsencrypt/live/$DOMAIN/ssl.pemservice lighttpd restart

Zakładam oczywiście, że skrypt letsencrypt jest pobrany z gita. Dodatkowo masz dostęp do roota, lighttpd jest skonfigurowane i ma podpięty certyfikat SSL. Plus, że w konfiguracji lighttpd jest linia w stylu:

ssl.pemfile = "/etc/letsencrypt/live/mojadomena.com/ssl.pem"

To co wyżej to sama esencja, brakuje choćby kontroli błędów/statusu wykonania poleceń. Ale wywołane z ręki działa i pewnie dodam do crona wykonywanie raz w miesiącu (wzmocnione przez && w ramach „kontroli błędów”). Opisuję, by mi nie zginęło. Poza tym, widziałem albo skrypty automatyzujące, albo opisy uruchomienia letsencrypt z lighttpd. Liczę więc, że zebrane do kupy się komuś przyda.

UPDATE Wpis się lekko zdezaktualizował o czym więcej w tym wpisie. A krótko: jest gotowiec od EFF o nazwie Certbot do automatycznego zarządzania darmowymi certyfikatami SSL Let’s Encrypt. Z opisami użycia dla różnych serwerów.