信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    スワップのお話

    若いエンジニアとの技術的乖離をどうにかせねばっ!・・・と、今時の技術を猛勉強している老兵エンジニアの大西です。さて、今回は少し前に行った技講時にも質問がありましたのでスワップのお話を少し記そうと思います。サーバを扱うWeb屋としては基本中の基本ですが良かったら読んでみて下さいね。スワップの前にメモリーのおさらいなどメモリーといっても容量(サイズ)ではなく領域のお話になるのですが・・・メモリ上にはザックリとおおまかに2種類の領域が存在しますよね。1つは「ユーザプロセス空間」で、もう1つが「ファイルキャッシュ」。この2種類の領域においてshrinkの比率が設定されていて、この設定を司っているのが vm.swappiness となります。(shrink: 解放あるいはスワップアウト)vm.swappinessこの vm.swappiness ですがカーネル 2.6.32-303 を境にその意味が大きく変更されました。2.6.32-303未満では[vm.swappiness=0]は最小比率となりユーザプロセス空間をshrinkします。一方2.6.32-303以降では[vm.swappiness=0]の時はユーザプロセス空間はshrinkされません。これは2.6.32-303以降、つまり現カーネルにおいては[vm.swappiness=0]だと解放可能な使用済ユーザプロセス空間が残り続ける事が予想されるので、[vm.swappiness=0]ではなく[vm.swappiness=1]の方が良いのだ・・・となるわけです。メモリーおさらい基礎知識サーバを扱っているエンジニアの方はよくよく目にすると思いますがあらためて記してみます。Anonymous Memory[Pages]スワップが必要でかつ解放不可能なメモリー。ユーザプロセス空間などがこれに当たります。File-backed Memory[Pages]ディスクなどへ書き出す事で解放可能なメモリーです。/proc/meminfo を見てみるActive(anon)匿名ページのアクティブ分Inactive(anon)終了プロセスなどの解放可能な匿名ページActive(file)File-backedのアクティブ分Inactive(file)解放可能なFile-backedAnonPages約 Active(anon) + Inactive(anon)Buffers + Cached約 Active(file) + Inactive(file)vm.swappiness=100 とは?この状態は Anonymous と File-backed のスワップ比率が同じ状態になります。カーネルのプログラム関数 get_scan_ratio() において、anon_prio = sc->swappiness;file_prio = 200 - sc->swappiness;とあり、[vm.swappiness=100]の場合は anon_prio も file_prio も同じスワップ比率となります。カーネルを覗いてみるmm/vmscan.c に get_scan_ratio() があります。  static void get_scan_ratio(・・・) {    anon_prio = sc->swappiness;    file_prio = 200 - sc->swappiness;    // vm.swappiness=0 の場合は常に ap=0    ap = anon_prio * (reclaim_stat->recent_scanned[0] + 1);    ap /= reclaim_stat->recent_rotated[0] + 1;    fp = file_prio * (reclaim_stat->recent_scanned[1] + 1);    fp /= reclaim_stat->recent_rotated[1] + 1;    /* Normalize to percentages */    percent[0] = 100 * ap / (ap + fp + 1);  <- Anonymousの比率は ap=0 なので 0    percent[1] = 100 - percent[0];  <- こちらは File-backedの比率[vm.swappiness=0]にすると Anonymous の比率が 0 なのでスワップが発生しない事になりますね。実験してみたメモリー数十メガバイトという仮想サーバを作りそのサーバ上で数ギガバイトの圧縮データを zless してみた。vm.swappiness=0 -> スワップは発生しませんが、OOM Killer が発生しました。vm.swappiness=1 -> スワップが発生しましたが、プロセスはダウンしませんでした。結論今時の Linux でスワップをぎりぎりまで我慢させたい場合は、vm.swappiness を 0 にするのではなく 1 にしよう。ちなみに OOM Killer についてもよく技講にて質問されます。気が向いたら次回のブログ担当の時にでも。
  • 健康

    やはり運動が大事

    ゴールデンウイーク前には年齢も半世紀を過ぎます。エンジニアには年齢的に様々な「限界説」が囁かれている昨今。よくもまぁしぶといなぁ~と自分でも思います。さて若い頃は全く気にしなかったのに、この歳になり気になり出した事の1つに「お腹」があります。洋ナシ体型とはよく言ったものです。お腹がポッコリなのです。元は痩せの低身長なのでお腹がポッコリとなると服も合わないので色々と面倒なんです。このお腹を凹ませるために自宅の近くにあるフィットネスクラブを検索。お小遣いとのバランスもあり一旦棚の上に。次にチャレンジしたのがジョギング。少し走っただけなのに膝にきました。体を壊す危険があるのでだめ。次にウォーキング。これは休日に今でも時間のある時は行っています。1駅、2駅離れた公園までウォーキングすると気持ち良いですし良い汗もかきます。ただ汗はかきますが今のところ目に見える効果はなさそうです。気持ちは良いので続けている・・・という感じです。現在思考中なのが市販のお薬。お薬を売っているところでよく見る「おなかの脂肪を落とす」系のお薬です。半年程続けているのですが、凹まないですねぇ。。。ただすぐには効果も表れないとの情報もあるそうなので、もう少し続けてみようと思います。家族の皆はやはり運動だとの事。この歳だときちんとトレーナーの方を付けないと危険との意見もあり、フィットネスクラブなど含め検討中です。実際に素人ジョギングでは膝軟骨辺りも痛めてしまいましたからね・・・そうなのかなぁ~とも思います。皆さん、特に若い皆さん、運動しましょう。付くのは簡単ですが取るのが困難な脂肪は本当に厄介です。自分にあった作業環境を早く手に入れたエンジニアほど能力向上が期待出来るのと同じで、日常長く続けられる運動を見つける事も大切なのだと、この歳になって学んだのでした。おしまい。
  • テクログ

    データベースに関するTips

    どうも、もう少しで50歳(半世紀)になる大西です。開発に携わっていると同じ結果を導くにあたり多くの手法が存在する事に気付くだろう。1つしか手法を知らず後になって損をしていた事に気付く・・・そのような経験も多いのではないだろうか。データベースについては30年以上前から今だに「そのような手法があるのか」と感心する事が多々ある。今回はデータベースの中でも MySQL に関しての「その方法でも出来るね」について記そう。■ TIMESTAMP および DATETIME の自動初期化および更新機能さて、まずはこれだ。最近でもカラムとして登録日時と最終更新日時を持たせている設計を多く見かける。きちんとシステム上必要なのであれば良いのだが「とりあえず入れとけ」は止めて頂きたいと常に思っているカラム達だ。このカラムが存在するにも関わらず無視しているプログラムは論外として、INSERT 時に「登録日時」と「最終更新日時」を、UPDATE 時に「最終更新日時」を、それぞれ NOW() を使用して値をセットするプログラムを多く見かけるのだが、経験上データベース側の日時値ではなくプログラム側の日時値でお願いしたい(プログラム側で日時データを作りその値をデータベースに適用するようにして欲しいのだ)。特に MySQL の日時については Ver8.0 になっても 2038年問題は残ったままのようだしプログラム側の日時値でお願いしたいものだ。何はともかくこれら私の希望を一旦棚の上に置くとして、登録日時と最終更新日時カラムが単にそのレコードの登録/更新の日時を表すだけならば NOW() を使うのは避けるべきだと述べておく。ではどうするのか。それは INSERT の時は登録日時と最終更新日時を、UPDATE の時は最終更新日時だけを自動でセットするようにすれば良い。テーブルを見てみよう。Create Table: CREATE TABLE `TBL_TEST` (     `key` varchar(32) NOT NULL,     `value` text NOT NULL,     `update_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     `create_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,     PRIMARY KEY (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 update_at カラムはデフォルト値として CURRENT_TIMESTAMP を、そして ON UPDATE CURRENT_TIMESTAMP で更新時はその時の日時をセットするカラムにしている。create_at カラムは update_at と同様だが更新時には反応しないカラムにしている。INSERT してみる。mysql> INSERT INTO `TBL_TEST` (`key`,`value`) VALUES ('test','hoge'); mysql> select * from `TBL_TEST`; +------+-------+---------------------+---------------------+ | key  | value | update_at           | create_at           | +------+-------+---------------------+---------------------+ | test | hoge  | 2018-01-13 02:01:04 | 2018-01-13 02:01:04 | +------+-------+---------------------+---------------------+ update_at、create_at 共に自動セットされている。UPDATE してみる。mysql> UPDATE `TBL_TEST` SET value='fuga' WHERE `key`='test'; mysql> SELECT * FROM TBL_TEST; +------+-------+---------------------+---------------------+ | key  | value | update_at           | create_at           | +------+-------+---------------------+---------------------+ | test | fuga  | 2018-01-13 02:01:38 | 2018-01-13 02:01:04 | +------+-------+---------------------+---------------------+ update_at のみ自動セットされている。最近はデータベース等のレコード結果を KVS などにキャッシュし高速化を図る手法も多く見かける。その場合も NOW() は避けよう(繰り返すが本心はプログラム側で生成した日時値をセットして欲しい)。何にせよ SQL もスッキリするしこちらの方がエレガントなので是非とも検討/実践して欲しい。■ SQL_CALC_FOUND_ROWS次はちょっとした Tips のようなものだ。検索結果などを表示する場合にはページングというテクニックを使用する場合があると思う。その場合ページングのため(結局何ページ分必要なのかを先に知る必要があるため)総レコード数を知る必要がある。この際に同じ WHERE句 で SELECT と COUNT(*) を発行して1ページ分のレコードと総レコード数を取得するプログラムを多く見かける。このような場合は SQL_CALC_FOUND_ROWS と FOUND_ROWS() を使うと良いだろう。mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE `hoge`>100 LIMIT 10; mysql> SELECT FOUND_ROWS(); 最初の SELECT で条件に合致するデータセット(1ページ分)が取得出来て、次の SELECT で条件に合致する(OFFSET / LIMIT 無関係の)レコード総数が取得可能だ。SELECT を2回発行する事に変わりはないのだが、こちらの方がエレガントであろう。今回は案件でも多用しているであろう MySQL についてその Tips 的な事柄を書いてみた。この他にも MySQL には寿司ビール問題やハハパパ/アルファベットの大文字小文字問題といったキャラセット/コレーションに関する問題もある(これらの問題について知らないというエンジニアは今すぐ調べて欲しい)。MySQL もこれら問題に対応すべくデフォルトの設定を見直すなど出来るところから対応してくれている。プログラムやシステム、ミドルウェアのデフォルト設定などが「そうなっている」のには必ず理由があるものだ。その理由を知るだけでもスキルアップに繋がると思う。手元を見返し「そうなっている」理由を是非とも考えて欲しい。それではまた。
  • テクログ

    マリオ御一行様が訪ねて来たようです。

    いやはやクラウドという言葉も当たり前になったここ最近。本当に安くサーバを建てられるようになりました。しかもグローバルIPまで付いてくるんですから、もう、おじさんはビックリですよ。かく言う私もプライベートサーバを持っています。別に何かサービスを提供している訳ではありません。あくまでも公衆に迷惑をかけない範囲で、色々と勉強/試行したりするのが目的だったりします。さて、本題です。先にも書いたようにサーバを実際に公開しているかぎり、きちんと面倒をみてあげる必要がありますよね。個人のサーバとか、企業のサーバとか、お国のサーバとか、そんなの関係ないのです。どのようなサーバであろうと、きちんと面倒みてあげる必要があるのです。で、先日。当然わたしも面倒をみる訳ですが、一通り確認したい事を試行して最後に一通りログを見てまわったんです。いやぁ・・・いらっしゃってました。マリオ御一行様。。。クッパ、ヨッシー、ピーチ姫まで。。。おじさん歓喜!泣いたぜ。。。・・・まぁ、ただの辞書攻撃なんですがね。サーバ触っていると、こういう楽しみもあるという事でwww以上、マリオ御一行様が訪ねて来たようなのでブログに書いてみました!それでは!!