httpdプロセスのメモリ使用量をワンライナーで表示する

最近、何度かサーバーのメモリの使用情報を調べる期間があったのですまとめておきます。

対象システムはCentOS6.7。この手の作業が求められる状況は何かシステム障害が発生している時です。
そういう状況では準備作業することもままならないので、すぐに使えるOS標準のコマンドで対処します。

サーバーの状態を確認するならまずはtopコマンド。

ヘッダーの部分でサーバーの搭載メモリ量と空きメモリ量がどんな感じ把握できる。

今の値を知りたいだけならpsコマンドとawkを組み合わせる

$ ps aux | awk '/http[d]/{s+=$6}END{printf("%\04710d\n",s)}'
うっかり数値の桁を読み違えたりしないように桁合わせとカンマを入れておくのがポイントです。
88,632

topコマンドみたいにずっと状態をワッチしたいならbashで全体をループさせてしまう。

$ while true; do ps aux | awk '/http[d]/{s+=$6}END{printf("%\04710d\n",s)}'; sleep 1; done
88,632
88,632
88,632
88,632
88,632
88,632
88,632

たまに画面をチラ見すだけ値と一緒に時刻も表示する。ついでにあとで値を使って集計できるようにファイルにも保存しておく。
$ while true; do dt=`date '+%Y/%m/%d-%H:%M'`;echo -n $dt;ps aux | awk '/http[d]/{s+=$6}END{printf("%\04710d\n",s)}'; sleep 1; done | tee res.log

2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912
2017/11/15-14:31 83,912

ありゃリャ、コマンドが長すぎてコピペ操作も思わず指先に力が入ってしまうほどの長さになってしまった。

所有している本中ではトップクラスの厚さ。めくるたびに何か発見がある。bashは学習コストも低いし、仕事でサーバー作業するならこれほど作業効率を上げてくれる道具はないです。

一度はやっとけアセンブリ言語

公園のベンチ

アセンブ言語(Assembly Language)を使っていた時期があります。私はずっとアセンブがプログラム言語のことだと思ってました。正しくはアセンブは機械語に変換するプログラムのことでした。そのハードウェア(CPU)のアセンブ言語仕様を実装したものがアセンブなので、なんとなく話のつじつまが合っていた。つまりアセンブをアセンブでアセンブする(なんて語感がいいんでしょう)という関係。そして機械語を再びアセンブリに変換するのが逆アセンブルです。こんなハードよりのプログラム言語の話に付き合ってくれる若者はいないでしょうが、リーバースエンジニアリングとか、高級言語の何が高級なのかとかが話題になったときネタにはなります。

アセンブリ言語はハードウェアに近いプログラミング言語です。マシン語はCPUレベルの命令です。ここまでやると、コンピューターの世界が全て0と1だということを実感できます。何を学習しようか迷ったら基礎の基礎をやってみてちゃいかが?

最近、どんな言語でプログラムを書いてますか

フィギュア

私はSwiftやってます。そうやって新しいプログラミング言語を学習を進める一方でC言語でcodeiqの出題にも挑戦してます。vimとgistだけでプログラムを書きます。その後でxcodeを使うと、この開発環境がどれだけモダンで開発効率のいいものかを強く実感できます。

他の皆は何を使っているの

こんなの見つけました。TIOBE 2015年前半プログラミング言語ランキング

スクリーンショット 2015-07-15 20.30.23

私の実感とはかなり開きがあります。どう考えてもC言語が2位だというのは納得がいかない。C#でもC++でもない、ただの”C言語”が2位です。これから取引する相手との会話でよく「XXは出来ますか?」と尋ねられるます。XXはプログラミング言語とかプロダクト名のことですが、そういうシュチュエーションで”C言語”というフレーズを聞かれることなんてまずない。いや、全くないです。自分が最後にC言語に関わったのは15年前。それもシステム開発ではなくてプログラミング実習の講師でした。翌年から研修で使うプログラミング言語はC言語からJAVAに変わったので、それ仕事としてC言語を使った最後です(遠い目)。

The ratings are based on the number of skilled engineers world-wide

複数の検索エンジンでキーワードで調査した結果らしいです。なんて言おうが私の置かれている状況ではTIOBEのレポートと現実は乖離してます。国内と世界では状況が違うのか、私が知らないだけで国内でもバリバリ使っている分野もあるってことなのかもしれないです。あっ、別にC言語の開発がしたいわけではないです。便利な開発環境があるなら知りたいだけです。

最近読んだ本

少しネタバレになるかもしれません。タイトルの”鈴木さん”とは日本人に多い苗字に当て込んだわけではなく具体的に特定の個人を指してます。当人は著名な方ですが本文の冒頭に実名で書いてます。こんなことして怒られないのでしょうか。そんな大胆な口調なわりに、凡人には思いつかないような鋭い視点でインターネットの未来を捉えてます。過去と現在を結ぶ延長にあるのが未来。ドッグイヤーの時間の流れに放浪されそうな時は、インターネットの黎明期を振り返ってみるのもいいもんですね。

C言語でシーザー暗号(復号)

ドリンクカップ

どこのニュースでも熱中症に注意しろと繰り返してます。がぶがぶ水分を摂ってます。

codeiqから判定とフォードバックをもらいました。わざわざ丁寧に解説までしてくれるところが素晴らしい。挑戦するたびに何かしら学ぶところがある。いや、どちらかというと目から鱗が落ちるというか、脱帽するようなことのほうが多いかな。今回(基本的な暗号を解いてみよう[増井技術士事務所])の模範回答(Ruby)はとてもいいアルゴリズム(ROT13)だったので、復習がてら自分のソースコード(C言語)にもマージ。ソースコードを載せときますが、C言語だと型違いなど関係なく演算できてしてしまうあたりがワイルドです。

コンパイルと実行

cc -o codeiq codeiq_masui.c
./codeiq < indata

indataファイル

tbireazrag bs gur crbcyr, ol gur crbcyr, sbe gur crbcyr,
funyy abg crevfu sebz gur rnegu

複合結果

government of the people, by the people, for the people,
shall not perish from the earth

ずらす数を定数Xで宣言してます。26で一回りするので、13で2回ずらすとか、1ずらしたあとにさらに25ずらすとかすると元の文字列に戻ります。

EXCELのセルを埋めつくす実験

万年筆

EXCELのバージョン : EXCEL2010
マシン : Dell bostra 230 / 4GM / Windows7 pro

実験の方法 : ひたすらセルにデータを書き込んでみる

事前の調査としてVBAでループを回しセルには1,2,3と順番にループカウンタの値を書き込めることを確認する。

実行時間:約30秒
結果:正常終了。1048576行目まで書き込まれたことを確認。

Sub lineTest()
    Dim i As Long
    i = 1
    Do While i <= 1048576
        Cells(i, 1).Value = i
        i = i + 1
    Loop
End Sub

次に列方向にループを回して最後まで値を書き込めることを確認する。

実行時間:5秒
結果:正常終了。XFDセル(16384列目)まで書き込まれたことを確認。

Sub ColumnTest()
    Dim i As Long
    i = 1
    Do While i <= 16384
        Cells(1, i).Value = i
        i = i + 1
    Loop
End Sub

いよいよ本番です。上の行から順番に”0″を埋めていって、最期のセル(1048576,16384)まで書き込めるか実験です。
注意:実行には長い時間がかかります。強制終了の方法は。Ctrlキーを押しながらPauseキー押します。 「Esc」または「Ctrl」+「Break」で処理を中断させる事ができます。

Sub FullTest()
    Dim i As Long
    Dim j As Long

    StartTime = Time
    For i = 1 To 1048576
        For j = 1 To 16384
            Cells(i, j).Value = 0
        Next j
    Next i
End Sub

実行時間:約2時間30分
結果:異常終了。約2時間後にリソース不足エラー。
リソース不足エラー画面
データの埋まったセルは13263行目XFD列目(最終の16384列目)まで。パソコンを再起動したり、EXCEL以外のアプリを終わらせたりして試しましたが、すべてのセルを埋めることは出来ませんでした。

全てのセルには値を入れることはできないかった。使用するセルの数の制限があるのだろうか。それなら、さっきの実験では1行目から書いたが、1万行目から書き始めたら、13263行+10000行で23263目まで実行できるはず。更に実験してみる。

For i = 10000 To 1048576

実行時間:40秒
結果:終了。12329セル(16384列目)まで書き込まれたことを確認。どういう規則性があるのか不明。

<まとめ>
結論としては全てのセルを入力することはできなかった。VBAではなくコピペしても同じだった。データ量がある程度多くなると急にexcelの動作は不安定になる(応答しなくなる)。そしてどのくらい量を安全とするのはかは、パソコンの搭載メモリや空きリソースに影響するので一概には言えないが、数万行という単位のデータを扱うには不向きだということは言える。