カテゴリー: 技術

ISUCONの予選参加をした後、便利だったので自鯖に取り入れた etckeeper について

etckeeperとは

ツール名の通り、 /etc 以下をバージョン管理してくれるツールのことです。

中身自体は、gitやmercurialなので、違和感なく使えると共に、設定ファイルを書き換える際に、 hogehoge.bk や、 hogehoge.org 等作らずとも、バージョン管理を行ってくれます。

今回は、メインで使っているサーバー(Ubuntu 16.04.3 LTS)への導入をメモ書きとして残しておきます

インストール

Ubuntuを利用している場合、パッケージが既に登録されているので、以下コマンドを実行するだけでインストールすることが出来ます。

apt-get install -y etckeeper

また、パッケージインストールを行うと、Cronへの設定であったり等は行ってくれるため面倒なことはありませんでした。

設定変更

前の章で、etckeeperのインストールが完了したと思います。
次は、etckeeperの設定を変更しましょう。

設定ファイルは、 以下パスに存在します。
エディタ等使い編集を行ってください。

/etc/etckeeper/etckeeper.conf

内容を確認すると、VSCは何を利用するかや、コミットする際のオプション。
リモートレポジトリを用意する場合、名称をどのようにするか設定します

一部抜粋して載せると以下のような設定となりました。


# The VCS to use.
#VCS="hg"
VCS="git"
#VCS="bzr"
#VCS="darcs"

。。。。
。。。。

# The high-level package manager that's being used.
# (apt, pacman-g2, yum, dnf, zypper etc)
HIGHLEVEL_PACKAGE_MANAGER=apt

# The low-level package manager that's being used.
# (dpkg, rpm, pacman, pacman-g2, etc)
LOWLEVEL_PACKAGE_MANAGER=dpkg

# To push each commit to a remote, put the name of the remote here.
# (eg, "origin" for git). Space-separated lists of multiple remotes
# also work (eg, "origin gitlab github" for git).
PUSH_REMOTE="origin"

設定の有効化

etckeeperを動作させるべくinitializeを行います。

etckeeper init

上記コマンドを実行すると、 /etc/.git/ が作成され、 /etc 以下をバージョン管理下としてくれます。

試しに、 /etc に移動し、git status と入力してみてください。
見慣れた、実行結果が返却されるかと思います。

リモートレポジトリの設定

etckeeperの導入と合わせて、 /etc 以下をリモートレポジトリで管理するように設定します。
今回、リモートレポジトリ先としてgitレポジトリを、 bitbucket 上に用意しました。

先程の設定でリモートレポジトリの名称を origin と競って済みなので、
以下のコマンドを実行することで、 etckeeper が変更を検知すると自動的に、pushまで行ってくれます。

実行するコマンドとしては、以下のようになると思います。
ユーザ名や、レポジトリ名は適宜読み替えて実行するようにしてください。

git remote add origin git@bitbucket.org:XXXXXX/etckeeper.git

また、合わせて、rootレポジトリ以下にssh鍵を用意、設定まで済ませるようにしてください。
こちらについては、私の場合は設定済みだったため割愛させていただきますが、実行する内容としては


# cd /root
# mkdir .ssh
# cd .ssh
# ssh-keygen

くらいだと思います。
あとの鍵の登録は、各種サイトによって異なると思いますので調べてみてください

コミットしてみよう

上記すべての設定が完了したら、コミットしてみようと思います。
コミットも簡単で以下のように実行するだけです。


etckeeper commit -m 'first commit'

上記のように実行すると、裏側でVCSのコミットとプッシュが実行されます。

また、中身自他は今回VCSのwrapperなので、(今回は、gitを選択リモートレポジトリもoriginと登録しているため省略)
以下のように実行することも可能です。


# git add /etc/hoge/hoge
# git commit -m 'hoge hoge'
# git push

まとめ

今回、etckeeperを導入してみましたが、
冒頭にも書いたとおり、バックアップファイルや、日付の連番ファイルを大量に作成されることがなくなりました。
ファイル実態が残っていることによる安心感もありますが、サーバー内にゴミファイルが溜まっていくことと、いつか掃除しなければならないと考えると
とても便利なツールであるなと実感しております。

導入も簡単なので是非導入してみてください。

ISUCON7予選に参加したお話

結果から先にお伝えしますと、予選通過できませんでした。

そして今頃振り返ることにしました。

まとめ

会社の先輩方と ( @kopug, @dabits ) チーム「TMFusion」として参加しましたが、1日目、2日目のマージ後ランキング 32位 (スコア: 96,576 )  で予選通過出来ませんでした。

そんな私が、前日までにやったことと、当日やったことをさらっとまとめます。

事の発端

@chimame さんが、FacebookにISUCONについて9月頭に投稿したのが始まり

CTO始め、有志が集まりプロジェクト(なのかわかりませんがw)が始動しました。

CEO始め、参加しない方々からもいい意味でプレッシャーをかけていただき。合わせて、オフィスが名古屋、大阪と別れている事もありチームによってはリモートで予選を行う事も考えられましたが移動のための交通費も会社が負担して頂けることに。様々な大人の方にバックアップ頂いた中、結果が出せず非常に悔しい思いです。

前日までにやった事

ISUCON前日までは、ひたすら過去問を行いました。

一番最初に行った過去問は去年の予選でした。(マシンスペックにもよりますが)約200点台と非常に低かった事で火がついた事は鮮明に覚えています。

ある過去問のベンチマークアプリケーションの不具合に悩まされたり、goは書いていたので気分転換にgoに手を出したらドハマリしたりと今となってはいい思い出です。

今回事前に説いた過去問は以下を行いました。

  • ISUCON6 予選
  • ISUCON5 予選
  • pixiv ISUCON
  • yahoo ISUCON

ちなみに、ISUCONの予選は会社の制度を使わせて頂き予選前の3週間は15時位からチームで集まって過去問を解くようにしていました。

また、今回使用しようチームで決まっていた言語はPHPでしたのでおそらく使われるであろうSlimFrameworkのドキュメントを入念な確認も行いました。

それに合わせて、ルーティングキャッシュや、テンプレートキャッシュ、リクエストヘッダのログ出力、OPCacheのリセットスクリプト、デプロイスクリプト等ある程度予測が出来、使用確度が高いものはすぐ適用できるようにスニペットに用意しておきました。

加えて、当日の役割分担やISUCON環境をぶっこ抜くScriptをつくったりと楽しみながら且つ着々と準備を行なっていきました。

当日の事

当日は、そもそもしっかりと運営の案内に目を通していなかったので目を通すと共に、Discordにも入っていなかったりとバタバタしながら準備を行いました。

皆さんご存知の通り開始が大幅におくれたこともあり、別の所に用意していたGitlabのスニペットに使用するであろうコード等を移動させ複数画面を行き来せずとも快適な環境をつくることとしました。

また、待っている間のDiscordでのみなさんとのわいわいは、特別な空気感もありとてもたのしかった印象です

(気になったのでアニメを全く見ない私ですが終わってから、ちゃんと「NEW GAME‼︎」をプライムビデオで見ましたww)

前置きはさて置き、協議中のことも書こうかと思います。スタートの合図とともに、アプリケーションを担当した私が行った事を順に挙げると

  • サーバー構成の確認
  • ソースコードをバージョン管理下に置きソースの確認
    • 合わせて、方針や改善ポイントの洗い出しや順位づけ
  • ベンチマークの実行
  • スニペットに用意しておいた、リクエストヘッダのログ出力コード・Slim Frameworkで用いるルーティングキャッシュ・Viewキャッシュのコード適用、デプロイスクリプトの配置

ざっとここまでを1hちょっとで行いました。

その後に、DBに入っていた画像を外だししたり、initializeのときにメモリに乗っけられるものは全部乗っけるようにしてみたり、ISUCONのアプリケーション側で行う定石をつぎつぎに行っていきました。

ただ、うまく行かなかった点として、インフラとアプリケーションの連携がうまく行かなかったことです。何がうまく行かなかったかというと、DBに入っていた画像を外だしした際に何故かスコアが下がる現象が発生し、3人共何が悪いのかさっぱりわからなくなったことが発端となり、一旦全部もとに戻そうとインフラもアプリケーションも初期状態までロールバックしその後今まで行ってきた変更を1つずつ反映していくということを行いましたw

これがものすごく時間を食ったことに加え、このときばかりは少しチームの雰囲気も悪くなってしまったように感じました(普段はそんなこと無いのですが)

そんな、こんながありましたが、「96,576点」まで行くことが出来ました。

ちなみに、ベンチマーカーの複数選択出来る仕様であることをしらず、非常に悔しい思いをしました。ちなみに、複数選択出来ることを知ったのは、振り返りのお酒の場でした。自分たちのチームメンバーだけではなく、競っていた社内の他チームも知らなかったとのことなのでもしかしたら予選通過出来ていた可能性もあると考えると非常に悩ましいですし、なぜ複数チェックを入れなかったのか予選中の私をすこし攻めたい気持ちもあります。

良かったこと

予選前に、過去問や他社さんが公開しているISUCONを行うことによって予選時に特に慌てることなくいい感じに早くすることに注力出来たのかなと思います。また、ここでの取り組みが少しずつではありますが、業務にも生きているように感じています。

加えて、予選だけではなく当日の進め方や、事前にレポジトリ作成を始めとする準備をしっかり行っていたこともあってか、よりPHPerの私としては知識であったり知見が多く得ることができたのかなぁと思います。

何事も準備って大切ですね

また、私転職したばかりで、同じチームの人とコミュニケーションはありましたが、ほかチームとはなかなかコミュニケーションだったりを取れていませんでしたが、ISUCONの取り組みを行うにあたって、コミュニケーションの輪が広まったように思います!

チームとしての課題

チームとしての課題は明確に1つコミュニケーションだと考えています。当日の事にも記載した通り、チームで壁にぶつかった時こそ一呼吸おいて動くようにするなどするべきだったのかなと今になって思います。

私の課題

私の課題としては、今回アプリケーションに専念させていただきながらももう少しインフラ側をどうするか等、積極的に首を突っ込むべきだったと思っています。

日常の業務でもそうですが、範囲に区切りをつける事は重要ですが、あくまで区切りは目安であって制約ではありません。

私は◯◯だから、△△だけやろうではなく、□□に対しても、◯◯だからこそ出来ることがある事は確かではないかと思います。

偉そうなことを書きましたが、私のインフラに関する知識不足が1つの原因である事は確かなのでこちらは今まで以上に努力しようかなと考えいます。

まとめ

反省点も多いですが、今回予選参加に当たって知識として多く身につけられた事は非常によかったと思っています。

また来年も参加したいなと思っていますのでコツコツと技術を磨き来年こそは本戦で花を咲かせたいなと思ってます!

そして、運営の皆様お疲れ様でした!

dRubyを使ってみた

dRubyとは

  • 分散オブジェクトプログラミングのためのライブラリ
  • Ruby のプロセスから他のRubyプロセスにあるオブジェクトのメソッド を呼びだすことができる
  • 他のマシン上のプロセスにも アクセスできる

Document

Source

受信側

require 'drb/drb'

class Puts
    def initialize(stream = $stdout)
            @stream = stream
    end
    def puts(str)
            @stream.puts(str)
    end
end

uri = ARGV.shift
DRb.start_service(uri, Puts.new)
puts DRb.uri
sleep

送信側

require 'drb/drb'

uri = ARGV.shift
client = DRbObject.new_with_uri(uri)
client.puts('Hi ')

実行

受信側

ruby receive.rb druby://localhost:10000

送信側

ruby post.rb druby://localhost:10000

実行結果

受信側

% ruby put.rb druby://localhost:10000
  druby://localhost:10000
  Hi

dRubyを使ってみて

Cとかで実装するよりも簡単に行うことが出来ました