Ubuntu Server 15.04で無線LAN接続する

要約

  1. GW-450D KATANAを買って、
  2. BitBucketにあったドライバの最新のソースコードを入手して、
  3. GW-450D KATANAのデバイスID(0x2019, 0xAB31)を追加して、
  4. コンパイル + インストールして、
  5. 無線接続の設定を追加して常駐化させた。

環境

OSUbuntu Server 15.04 beta 2
無線LAN親機AirMac
サーバの設置場所トイレ

ドライバをインストールするまで

ドライバのソースを入手してGW-450D KATANAのデバイスIDを追加

# common/rtusb_dev_id.c

 USB_DEVICE_ID rtusb_dev_id[] = {
 #ifdef MT76x0
+       {USB_DEVICE(0x2019,0xAB31)}, /* GW-450D KATANA */
        {USB_DEVICE(0x148F,0x7610)}, /* MT7610U */
        {USB_DEVICE(0x13B1,0x003E)}, /* MT7610U */
        {USB_DEVICE_AND_INTERFACE_INFO(0x0E8D, 0x7630, 0xff, 0x2, 0xff)}, /* MT7630U */
$ sudo apt-get install build-essential
$ make
$ sudo make install

# アダプタの設定を変更して再起動
$ cat /etc/Wireless/RT2870STA/RT2870STA.dat
CountryRegion=1
CountryCode=JP
WirelessMode=5
NetworkType=Infra
Channel=0

$ sudo reboot

GW-450D KATANAを差し込んだ時にドライバが反応してればOK

$ sudo journalctl -af -o cat
usb 1-3: New USB device strings: Mfr=1, Product=2, SerialNumber=3
usb 1-3: Product: GW-450D
usb 1-3: Manufacturer: Planex
<-- RTMPAllocTxRxRingMemory, Status=0
<-- RTMPAllocAdapterBlock, Status=0
==>RT65xx_WLAN_ChipOnOff(): OnOff:1, Reset= 0, pAd->WlanFunCtrl:0x0, Reg-WlanFunCtrl=0xff000002

無線接続の設定を追加して常駐化させるまで

$ sudo apt-get install wicd-curses
$ sudo systemctl restart wicd
$ sudo wicd-curses

接続するネットワークを選んで ➡︎
f:id:Ajido:20150418143020p:plain

「Automatically connect to this network」を有効にする。WiFi Passwordを入力して F10 f:id:Ajido:20150418143848p:plain

  • systemd-sysv-generator 経由で起動したデーモンは再起動時に自動起動される
  • 自動起動の停止は systemctl masksystemctl disable は使えなかった)

通信速度を測定する

$ curl -L https://raw.github.com/sivel/speedtest-cli/master/speedtest_cli.py -o speedtest-cli
$ chmod +x speedtest-cli
$ ./speedtest-cli
...
Download: 157.32 Mbit/s
Upload: 46.54 Mbit/s

備考

  • 手元にあったBUFFALOの無線LAN子機はLinux Kernel 3.x系に対応したドライバがなかったので利用できず
  • GW-900Dなら対応したドライバがあったので先にコレを購入したんだけど、2Mbps程の速度しか出なかった…
  • 最初はwicdなしで設定してたんだけど自動再接続が不安定で、動いたり動かなかったりしたので誰か設定教えて下さい

参考リンク

ISUCON4で開幕暫定一位を獲得しました。

ISUCON4 の予選(総合の7位)と本選(23位)に参加してきました。

予選

  • limits.conf, sysctl, nginx.conf の最適化
  • MySQL のインデックス追加
  • Unix Domain Socket を使うように Go アプリを修正
  • CSS ファイルをひとつにまとめる

他 Redis, Varnish を差し込もうとしましたが、デバッグに追われ時間切れでした。

本選

  • limits.conf, sysctl, nginx.conf の最適化(なぜ expires を設定しなかった)
  • データを複数台の Redis に分散して使うように Go アプリを修正
  • 安定しないスコアに法則性を見出そうとしてデプロイとロールバックを繰り返していました

/asset に 17s かかってるログを見たのに expires を設定しなかったんですよね。愚か。

 

開幕暫定一位とは

 参加するからには何かしら結果を残したい。優勝や入賞などの公的な結果を残せなかった場合でも、なんらかの形で記憶に残る結果がほしい。 そんな思いから勝手に生み出された心の拠り所が「開幕暫定一位」です。
 開幕暫定一位とは、「競技の開始直後に他のどのチームよりも早くベンチマークを実行して、その結果が出た瞬間を切り取れば、一位以外のなにものでもない」という状況を指します。以下の画像を参照。
 

f:id:Ajido:20141113004045p:plain
予選で開幕暫定一位を獲得したMEAN普及委員会

 

f:id:Ajido:20141113004341p:plain
本選で開幕暫定一位を獲得したMEAN普及委員会

 

開幕暫定一位を獲得するために

 
レギュレーションが発表され AMI ID が判明次第、即インスタンスを起動できる準備を整える。

# fabfile.py

def ec2_launch(ami_id):
  launch_args = ' '.join([
    '--image-id', ami_id,
    '--security-groups', 'isucon',
    '--instance-type', 'm3.xlarge',
    '--no-ebs-optimized',
    '--region', 'ap-northeast-1',
    '--key-name', 'ajido',
    '--block-device-mappings', '\'[{"DeviceName":"/dev/xvda","Ebs":{"VolumeType":"standard","DeleteOnTermination":false,"VolumeSize":8}}]\''
  ])
  local('aws ec2 run-instances --count 1 ' + launch_args)

 
ベンチマークの実行方法を推測する。コマンドは毎回異なるようなので、臨機応変に対応する。
当日直前に公開されるレギュレーションをチェックしている暇はないので、仕様は -h から読み取る。

## マニュアルに記載されている実行方法
$ sudo su - isucon
$ ./benchmarker bench --api-key XXXXXXXX

## Switch User を使わず一行程で実行する
$ sudo -u isucon /home/isucon/benchmarker bench --api-key XXXXXXXX

 
初期実装のバグに対応する。このあたりが一番楽しい。結構焦ります。
まず予選では直接ベンチに関係しませんが、障害がひとつありました。

## supervisor で実装が切り替えられない → 起動に成功するけど落ちる → EADDRINUSE っぽい → プロセスチェック
# Unicorn が起動してたので殺す
$ sudo netstat -apn | grep LISTEN

 
本選ではスコアサーバを含め、初期実装には三つの障害がありました。

## "Connection refused" → 80をチェック → LISTEN してない → nginx を起動
$ sudo lsof -i:80
$ sudo service nginx start

## "< invalid" なんとかで失敗する → アプリの初期実装にバグがありそう → Go に切り替える
$ sudo service supervisord stop
$ sudo vim /etc/supervisord.conf
$ sudo service supervisord start

## wsの接続に失敗してベンチが終了する → スコアサーバの問題っぽいので無限ループにして放置(ごめんなさい)
$ while :; do ./benchmarker remote -H XXXXXXXX; done

 
予選・本選共に開始数分でベンチを実行してスコアを送ることができました ╭( ・ㅂ・)و ̑̑ グッ !
 
予選は初期実装に障害がなかったものの競合が多く、スクショを取った直後には開幕暫定二位が出現していました。対して本選は競合が少なかったものの、初期実装の障害の多さにはテンションが上がりっぱなしでした。
 

最後に

 はじめての参加でしたが、本当に楽しいイベントでした。運営スタッフの皆さん、ありがとうございましたmm