【OCI/GCP/AWS】メモリ1GBの無料インスタンス生活にはスワップメモリが必要

メモリ1GB無料インスタンスは太っ腹……だけど1GBでも足りない😭

 クラウドの無料インスタンスを利用している方の用途は、だいたいWordPressなどを用いた個人サイトかと思います。最近はメモリ1GBの無料VMが各社から提供されるようになり、個人サイトの運営はだいぶ楽になりました。私も、無料でこそありませんがAWS LightSailのメモリ512MBでさんざん苦労したWordPressを1GBに増やしたら安定した経験があります。

 しかし、少し欲張ったとたんにメモリ1GBでも足りなくなってしまいます。自宅にもLinuxサーバーを置いている方は、だいたいこんな感じで

メモリ32GB以上、プロセッサ8vCPUくらいはあるので、重いサーバーソフトを入れても「いきなり全く動かない」事態に直面することは無いと思います。しかしこの感覚でメモリ1GBの無料インスタンスを使うと大変なことになります……。

Logstash(ETLツール)がフリーズしまくる

 2年ほど前からツイートデータなどの蓄積・抽出にElastic Stackを使っています。全文検索エンジンのElasticsearch、データ前処理(ETL)ツールのLogstash、BIツールのKibanaが3点セットで構成されています。

 今回、このうちLogstashだけOCIの無料枠VMインスタンスに設置を試みました。というのも、自宅の回線が低速・不安定なため各種情報サービスからAPI経由で安定してデータを取得するのが難しいからです。

回線が安定したパブリッククラウドで『クラウドETL』

エンタープライズ系ツールの鬼門『JavaVM』

 ところが、データベース周りなどエンタープライズ系のツールは、複数のOSやプラットフォームで互換性を確保するため、たいていJava VM上で構成されています。まずJava VMを起動して、その上で各種アプリを起動する仕組みです。しかしこれがデカい……。

 メモリ1GBのインスタンスにLogstashをインストールして起動したところ、またたく間にメモリがすべて食いつくされてしまいました😨

こうなるともう大変。sshでのログインすら出来なくなり、モニターを見ると再起動をかけるたびにOSがフリーズしているのです😭

サーバー向けUbuntuにはスワップが初期設定されていない

 私はメモリー極小のレンタルサーバー時代からLinuxを使っていたので、てっきりクラウドのインスタンスにもスワップメモリ(メモリが足りなくなったときに、一時的にデータをディスクに退避させてメモリ不足を防ぐ仕組み)が設定されていると思い込んでいました。

 ところが、サーバー向けUbuntu Linuxのイメージは初期設定ではスワップが設定されていないのです。従って、メモリ使用量が1GBに達するとそのままOSがフリーズしてしまうことになります。

 私は泣きながら再起動して速攻でsshしてLogstashをいったん止めた上で、スワップの設定を行い、なんとかLogstashの動作を安定させることが出来ました。

スワップの設定後。2GBのスワップ領域が確保されデータの一部が退避されている

サーバーでスワップは設定するべきか?

 なぜ、Ubuntuサーバーでは初期設定でスワップが無いのでしょうか。理由はふたつ考えられます。

 第一の理由は、『速度重視』です。Webサーバーなど多数のアクセスをさばかなければならないサーバーは、常に高負荷の状態にあります。データを頻繁にディスクに退避させると、メモリとの速度差のぶんだけサーバーの処理速度が落ちてしまいます。特に業務用途では避けたいところです。

 第二の理由は、『ディスクの消耗』です。一般的にディスクはメモリーと比べて寿命が短く、頻繁にアクセスすると故障につながる恐れがあります。サービスダウンが許されない業務用途では、これも避けたいところです。

 しかし、個人用途のサーバーはめったに高負荷になりませんし、遅くても我慢すればどうにかなります。しかも、遅いと言ってもハードディスクの時代とは違い、今ではSSDなので大して遅くありません。さらに言ってしまえば、ディスクが消耗しても困るのはクラウドサービス側だけです……💦

 というわけで、

個人用途のクラウドインスタンスには遠慮なくスワップを設定しよう

というのが私の結論です。

Ubuntu 21.04ノート 環境構築(2日目)

細かい環境構築

 初日でUbuntu Linux 21.04の基本的なインストールが終わりました。プレリリース版であるDaily Buildでの導入でしたが、既にリリース月ということもあり大きな障害はありませんでした。

 2日目以降は細かい環境構築と機械学習周りの整備となります。

VLC動画再生
Spotify音楽配信
ubuntu-restricted-extras音楽や動画のコーデック
LibreOffice ppaLibreOfficeの自動アップデート
ubuntu-defaults-ja日本語環境 ※未対応の模様
chrome-gnome-shell、GNOME Shell integration、拡張機能GUIをカスタマイズするツール群
sambaLAN上のWindows PCなどとファイルを共有する
xrdpまだ
SynapticAPT に基づくグラフィカルなパッケージ管理ツール
GSmartControlS.M.A.R.T対応のSSDなどの状態を調べるツール。このPCの内蔵SSDは非対応な模様

 どれもインストールが特に難しいということはありませんでしたので、詳細説明は割愛します。

Ubuntu 21.04にPostgreSQL 13をインストールする

準備

sudo apt install curl ca-certificates gnupg
curl https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
sudo apt update

 PosgreSQLをaptのレポジトリに登録します。

インストール

(base) masaru@ASUS-TUF-Gaming:~$ sudo apt install postgresql
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
以下の追加パッケージがインストールされます:
  postgresql-13 postgresql-client-13 postgresql-client-common
  postgresql-common sysstat
提案パッケージ:
  postgresql-doc postgresql-doc-13 libjson-perl isag
以下のパッケージが新たにインストールされます:
  postgresql postgresql-13 postgresql-client-13 postgresql-client-common
  postgresql-common sysstat
アップグレード: 0 個、新規インストール: 6 個、削除: 0 個、保留: 6 個。
15.6 MB のアーカイブを取得する必要があります。
この操作後に追加で 48.1 MB のディスク容量が消費されます。
続行しますか? [Y/n] Y

 デフォルトではバージョン13が入るようです。

(base) masaru@ASUS-TUF-Gaming:~$ sudo systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
     Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr>
     Active: active (exited) since Mon 2021-04-05 17:36:05 JST; 6min ago
   Main PID: 116889 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 37748)
     Memory: 0B
     CGroup: /system.slice/postgresql.service

 4月 05 17:36:05 ASUS-TUF-Gaming systemd[1]: Starting PostgreSQL RDBMS...
 4月 05 17:36:05 ASUS-TUF-Gaming systemd[1]: Finished PostgreSQL RDBMS.

無事動いているようです。

PgAdmin 4は未対応の模様

PgAdminはまだUbuntu 21.04に未対応のようです。

(base) masaru@ASUS-TUF-Gaming:~$ sudo apt install pgadmin4
[sudo] masaru のパスワード: 
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了        
状態情報を読み取っています... 完了        
パッケージ pgadmin4 は使用できませんが、別のパッケージから参照されます。
これは、パッケージが欠落しているか、廃止されたか、または別のソース
からのみ利用可能であることを意味します。

E: パッケージ 'pgadmin4' にはインストール候補がありません

LANからPostgreSQLに接続可能にする設定

(base) masaru@ASUS-TUF-Gaming:~$ sudo gedit /etc/postgresql/13/main/pg_hba.conf 
(base) masaru@ASUS-TUF-Gaming:~$ sudo systemctl restart postgresql
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
host    all             all         192.168.100.1/24            md5

ユーザーの作成

postgres=# create role masaru with superuser login;
select * from pg_shadow;

 usename  | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig 
----------+----------+-------------+----------+---------+--------------+--------+----------+-----------
 postgres |       10 | t           | t        | t       | t            |        |          | 
 masaru   |    16384 | f           | t        | f       | f            |        |          | 
(2 rows)

postgres=# alter role masaru with password 'xxxxxxxxxxx';
ALTER ROLE

データベースの作成

 『Google コミュニティ モビリティ レポート』のデータベースを作ってみます。

(base) masaru@ASUS-TUF-Gaming:~$ createdb google_mobility

 DBeaverで接続します。

 DBeaverでSQL文を実行してテーブルを作成します。

DBeaverでテーブルを作成する
create table google_mobility( 
	id SERIAL primary key, 
	country_region_code varchar(2) , 
	country_region varchar(255) , 
	sub_region_1 varchar(255) , 
	sub_region_2 varchar(255) , 
	metro_area varchar(255) , 
	iso_3166_2_code varchar(32) , 
	census_fips_code varchar(32) , 
	date date , 
	retail_and_recreation_percent_change_from_baseline integer , 
	grocery_and_pharmacy_percent_change_from_baseline integer , 
	parks_percent_change_from_baseline integer , 
	transit_stations_percent_change_from_baseline integer , 
	workplaces_percent_change_from_baseline integer , 
	residential_percent_change_from_baseline integer);

CSVデータのインポート

 いよいよCSVのインポートです。DBeaverはCSVも格納先フォルダをデータベースとして登録してからPostgreSQLにインポートするのがお作法のようです。

 データベース上のテーブルとCSVでカラム名が一致していれば、マッピングで困ることはないようです。

 とは言え、Google Mobilityデータも短期間のうちにplace_idというカラムが増えており、オープンデータの扱いのやっかいさを実感します。さらにCSVの中身が壊れているとインポートの段階で苦しみます……💦

 増えていたカラムはvarchar(32767)で格納されてしまっているので、varchar(32)に縮小します。

select place_id from google_mobility limit 10;
alter table google_mobility alter column place_id type varchar(32);

SQL select文でデータ抽出

select count(*) from google_mobility;
select * from google_mobility
	where sub_region_1 = 'Tokyo'
	order by date desc;
Google Community Mobility ReportからSQL select文でデータを抽出する

 4838804レコードから400ミリ秒ほどでselect文を実行できました。緊急事態宣言が解除された東京ですが、まだ交通、職場、小売店などでは自粛の影響が残っているようです。

Ubuntu 21.04使用開始(1日目)

Ryzen+NVIDIAのノートが欲しい。データベースと機械学習の全部入りラーメンだ

 前々から、図書館などでもガッツリ使い倒せるLinuxノートが欲しいと思っていました。具体的には、PostgreSQLがselect文で4スレッドくらい並列処理してくれて、TensorFlow/KerasでGPU SUGEEEE出来る程度のスペックです。

 Amazonの年末セールで『ASUS ゲーミングノートパソコン TUF Gaming A15 FA506IH (AMD Ryzen5 4600H/8GB・SSD 512GB/GTX 1650/1,920×1,080ドット (フルHD) (144Hz)/15.6インチ/フォートレス・グレイ)』が¥82,800と安かったので衝動買い。メモリは即32GBに増設しました。

「AMDが7nmで作ったワットパフォーマンスが良いRenoirが載ったノートにディープラーニングで使えるGTX 1650が付いて8万ちょい。買うしかない……」

 4600Hは6コア12スレッドのノートPC向けCPUで、AMD Renoirシリーズの廉価版です。『最強』ではありませんが、実売10万円以下のノートでこの性能は魅力的です。SSDは内蔵で別途2TBくらい欲しいですが、金欠なので追い詰まってから考えることにします。

AMD Ryzen 5 4600Hは7nm世代の廉価版モバイルCPU

 なお現在の最新モデルは「Ryzen PRO 5000シリーズ モバイル プロセッサ(5850U/5650U/5450U)」、及び「Ryzen 5000シリーズ モバイル プロセッサ(5800U/5700U/5600U/5500U/5400U/5300U)」で7nm世代のままです。5nmのZen4世代は2022年に登場予定です。

ゲーミングPCへのUbuntu 21.04のインストール

 Ubuntuのインストールが終わると、沢山の有名で楽しそうなアプリをリコメンドされます。「SSDの残りが300GBくらいしかないのに片っ端から入れちゃダメダ」と思いつつも入れられるうちはつい入れてしまいます。

日本語フォルダ名を英語化

 lsなどでパス指定するときにフォルダ名が日本語だとIMEの切り替えや入力が面倒なので、英語に変えてしまいます。

masaru@ASUS-TUF-Gaming:~$ LANG=C xdg-user-dirs-gtk-update

導入直後に入れたアプリ

 初心者でも導入に困らなさそうなものは名前だけ……。

NVIDIA driver metapackageNVIDIA独自のグラフィックドライバ。『ソフトウェアとアップデート』 – 『追加のドライバー』でプロプライエタリ版を指定してインストールする必要がある
Ubuntu Live Patchパッケージの自動更新サービス。実際は手動でapt updateを続けることが多いですが、念のため導入
Shutter画面キャプチャソフト。不具合のため現在使用できず
Krita定番の画像ソフト。Shutterが使えなかったので最優先で導入。個人的にも好きなソフト
Google Chrome, ChromiumWebブラウザ。SSOの誘惑と逃げたい気持ちでサンドイッチに
dbeaver-ceJDBCの汎用データベースクライアント
Anaconda言わずと知れたPython機械学習系のフレームワーク。PATHを汚染するので好きではないのですが、楽なので結局入れてしまいます
jupyter-notebookAnacondaに同梱のPython実行環境
Visual Studio Codeプログラム開発環境のデファクトスタンダード。Pythonなどのインタプリタを配下に置いてしまうAnacondaとの共存が課題
RAnacondaのパッケージとしてcondaでインストール
RStudioRの開発環境。PATHの問題を避けるためAnacondaからインストール
tracerouteサーバーまでのネットワーク経路を確認するツール
OpenJDK 11各種データベース用のJava開発環境

NDIVIAドライバの基本設定

 Ubuntu 21.04は、素の状態でNVIDIAの独自ドライバを使ってくれません。チューニングの観点から独自ドライバを入れるのが良さそうです。

masaru@ASUS-TUF-Gaming:~$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation TU117M (rev ff)
01:00.1 Audio device: NVIDIA Corporation Device 10fa (rev ff)

 続いて、aptのレポジトリに最新のドライバが降ってくるように設定します。

masaru@ASUS-TUF-Gaming:~$ sudo add-apt-repository -y -n ppa:graphics-drivers/ppaPPA publishes dbgsym, you may need to include 'main/debug' component
Repository: 'deb http://ppa.launchpad.net/graphics-drivers/ppa/ubuntu/ hirsute main'
Description:
Fresh drivers from upstream, currently shipping Nvidia.

## Current Status

Current long-lived branch release: `nvidia-430` (430.40)
Dropped support for Fermi series (https://nvidia.custhelp.com/app/answers/detail/a_id/4656)

Old long-lived branch release: `nvidia-390` (390.129)

For GF1xx GPUs use `nvidia-390` (390.129)
For G8x, G9x and GT2xx GPUs use `nvidia-340` (340.107)
For NV4x and G7x GPUs use `nvidia-304` (304.137) End-Of-Life!

Support timeframes for Unix legacy GPU releases:
https://nvidia.custhelp.com/app/answers/detail/a_id/3142

## What we're working on right now:

- Normal driver updates
- Help Wanted: Mesa Updates for Intel/AMD users, ping us if you want to help do this work, we're shorthanded.

## WARNINGS:

This PPA is currently in testing, you should be experienced with packaging before you dive in here:

Volunteers welcome!

### How you can help:

## Install PTS and benchmark your gear:

    sudo apt-get install phoronix-test-suite

Run the benchmark:

    phoronix-test-suite default-benchmark openarena xonotic tesseract gputest unigine-valley

and then say yes when it asks you to submit your results to openbechmarking.org. Then grab a cup of coffee, it takes a bit for the benchmarks to run. Depending on the version of Ubuntu you're using it might preferable for you to grabs PTS from upstream directly: http://www.phoronix-test-suite.com/?k=downloads

## Share your results with the community:

Post a link to your results (or any other feedback to): https://launchpad.net/~graphics-drivers-testers

Remember to rerun and resubmit the benchmarks after driver upgrades, this will allow us to gather a bunch of data on performance that we can share with everybody.

If you run into old documentation referring to other PPAs, you can help us by consolidating references to this PPA.

If someone wants to go ahead and start prototyping on `software-properties-gtk` on what the GUI should look like, please start hacking!

## Help us Help You!

We use the donation funds to get the developers hardware to test and upload these drivers, please consider donating to the "community" slider on the donation page if you're loving this PPA:

http://www.ubuntu.com/download/desktop/contribute
More info: https://launchpad.net/~graphics-drivers/+archive/ubuntu/ppa
Adding repository.
Adding deb entry to /etc/apt/sources.list.d/graphics-drivers-ubuntu-ppa-hirsute.list
Adding disabled deb-src entry to /etc/apt/sources.list.d/graphics-drivers-ubuntu-ppa-hirsute.list
Adding key to /etc/apt/trusted.gpg.d/graphics-drivers-ubuntu-ppa.gpg with fingerprint 2388FF3BE10A76F638F80723FCAE110B1118213C

Linux版のAnacondaはシェルから導入

 Anacondaはパスなど各種設定をOSから乗っ取る『お行儀が悪いフレームワーク』なためか、Ubuntuでもストアアプリには入っていません。シェルスクリプトを落としてbashで実行します。

masaru@ASUS-TUF-Gaming:~/Downloads$ bash ./Anaconda3-2020.11-Linux-x86_64.sh 

Welcome to Anaconda3 2020.11

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
...
masaru@ASUS-TUF-Gaming:~/anaconda3/bin$ ./conda init
no change     /home/masaru/anaconda3/condabin/conda
no change     /home/masaru/anaconda3/bin/conda
no change     /home/masaru/anaconda3/bin/conda-env
no change     /home/masaru/anaconda3/bin/activate
no change     /home/masaru/anaconda3/bin/deactivate
no change     /home/masaru/anaconda3/etc/profile.d/conda.sh
no change     /home/masaru/anaconda3/etc/fish/conf.d/conda.fish
no change     /home/masaru/anaconda3/shell/condabin/Conda.psm1
no change     /home/masaru/anaconda3/shell/condabin/conda-hook.ps1
no change     /home/masaru/anaconda3/lib/python3.8/site-packages/xontrib/conda.xsh
no change     /home/masaru/anaconda3/etc/profile.d/conda.csh
modified      /home/masaru/.bashrc
(base) masaru@ASUS-TUF-Gaming:~$ conda update --all
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/masaru/anaconda3


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _anaconda_depends-2020.07  |           py38_0           6 KB
...

Anacondaの功罪

 今回インストールしたAnacondaは2020年7月版。主な開発ツールのPATHを乗っ取る仕様であることを考えると半年以上放置されているのは少し疑念を感じます。もちろんconda updateはかけるのですが……。

 最新版をいち早く使いたい方はAnaconda無しのアカウントを作るか、仮想環境で運用することになりそうです。

(base) masaru@ASUS-TUF-Gaming:~$ python --version
Python 3.8.8

Ubuntu 21.04が待ち遠しい

DSC_0826
Ubuntu 21.04 Daily Build

 ASUSのノートPCを年明けにAmazonのセールで買いました。Ryzen 4600HとGTX 1650が載ったゲーミング仕様ですが、Linuxを入れる予定です。

 Linuxを入れるのはデータベースとデータ分析、Python機械学習が目的です。PostgreSQLは6コアを使ってくれますし、Tensorflow/Kerasなどディープラーニングのフレームワークもnvidia-smiなどの設定がうまく行けばGPUの並列処理を使ってくれるはずです。

 しかし今はまだWindows 10のまま。常用しているUbuntu 20.04のLinuxカーネルがAMD Ryzen 4000系のAPUに未対応だからです。

 カーネルだけ更新して世間のTipsが使えなくなるのも嫌なので、2021年4月リリース予定のUbuntu 21.04に合わせてOSを入れ替える予定です。

 写真はDaily BuildをUSBメモリから起動したところ。AMDへの対応が遅れがちなLinuxですが、Linusも今ではAMDのThreadripperを愛用しているとのこと。このノートでUbuntuが安定稼働することに期待しています。

 このブログでは、Ubuntu 21.04のインストールから各種環境構築まで一連の過程を記事として掲載しようと思っています。