2018/09/29

PRIMERGY TX1310 M1購入

FUJITSUのサーバ購入

お家サーバが動かなくなってもう10ヶ月。いい加減なんとかしようと探してみたら、NTT-X Storeで安く出ていたので購入。

1uのラックマウント型ケースにマザーボードを買ってきて組み立てていたけど、3,4年で動かなくなる。以前もサーバーのマザーボード交換 を行ったけど、ケースに収まるものを見つけるのが大変だった。

開封の儀

FUJITSUのダンボール。

キーボードやアクセサリが上の段。
重いサーバ本体は下の段。
ドライバー無しでケースを開けられるのが嬉しい。
左が底面、下が前面。底面に2台、隠しベイに2台HDDが取り付けられる。5インチベイにも取り付けられそうだけど、HDDのマウンターはついていない様子。

ディスクを移植してサーバ復活

ディスクを入れ替えてスイッチオン。無事にFreeBSDが立ち上がり、Network I/Fも認識されて復活。
と思ったら、USBキーボードが認識されない。/boot/loader.conf でehciをロードするよう設定して、解決。

Copyright (c) 1992-2013 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 8.4-RELEASE-p23 #3: Sat Jan 31 05:41:37 JST 2015
    root@dorothea.home.group.jp:/usr/obj/usr/src/sys/dorothea i386
gcc version 4.2.1 20070831 patched [FreeBSD]
Timecounter "i8254" frequency 1193182 Hz quality 0
CPU: Intel(R) Pentium(R) CPU G3420 @ 3.20GHz (3192.63-MHz 686-class CPU)

  Origin = "GenuineIntel"  Id = 0x306c3  Family = 6  Model = 3c  Stepping = 3
  Features=0xbfebfbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CLFLUSH,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE>
  Features2=0x45daebbf<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,EST,TM2,SSSE3,<b11>,CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,MOVBE,POPCNT,TSCDLT,XSAVE,RDRAND>
  AMD Features=0x2c100000<NX,Page1GB,RDTSCP,LM>
  AMD Features2=0x21<LAHF,ABM>
  TSC: P-state invariant
real memory  = 4294967296 (4096 MB)
avail memory = 3578269696 (3412 MB)
ACPI APIC Table: <FTS    D3219-A1>
FreeBSD/SMP: Multiprocessor System Detected: 2 CPUs
FreeBSD/SMP: 1 package(s) x 2 core(s)
 cpu0 (BSP): APIC ID:  0
 cpu1 (AP): APIC ID:  2
ACPI Warning: FADT (revision 5) is longer than ACPI 2.0 version, truncating length 268 to 244 (20101013/tbfadt-392)
ioapic0 <Version 2.0> irqs 0-23 on motherboard
kbd1 at kbdmux0
cryptosoft0: <software crypto> on motherboard
acpi0: <FTS D3219-A1> on motherboard
acpi0: [ITHREAD]
acpi0: Power Button (fixed)
acpi0: reservation of 67, 1 (4) failed
Timecounter "ACPI-fast" frequency 3579545 Hz quality 1000
acpi_timer0: <24-bit timer at 3.579545MHz> port 0x1808-0x180b on acpi0
cpu0: <ACPI CPU> on acpi0
cpu1: <ACPI CPU> on acpi0
pcib0: <ACPI Host-PCI bridge> port 0xcf8-0xcff on acpi0
pci0: <ACPI PCI bus> on pcib0
vgapci0: <VGA-compatible display> port 0xf000-0xf03f mem 0xf7800000-0xf7bfffff,0xe0000000-0xefffffff irq 16 at device 2.0 on pci0
pci0: <serial bus, USB> at device 20.0 (no driver attached)
em0: <Intel(R) PRO/1000 Network Connection 7.3.7> port 0xf080-0xf09f mem 0xf7d00000-0xf7d1ffff,0xf7d35000-0xf7d35fff irq 20 at device 25.0 on pci0
em0: Using an MSI interrupt
em0: [FILTER]
em0: Ethernet address: 90:1b:0e:xx:xx:xx
ehci0: <EHCI (generic) USB 2.0 controller> mem 0xf7d34000-0xf7d343ff irq 16 at device 26.0 on pci0
ehci0: [ITHREAD]
usbus0: EHCI version 1.0
usbus0 on ehci0
pcib1: <ACPI PCI-PCI bridge> irq 16 at device 28.0 on pci0
pci1: <ACPI PCI bus> on pcib1
pcib2: <ACPI PCI-PCI bridge> irq 18 at device 28.2 on pci0
pci2: <ACPI PCI bus> on pcib2
pci2: <network, ethernet> at device 0.0 (no driver attached)
ehci1: <EHCI (generic) USB 2.0 controller> mem 0xf7d33000-0xf7d333ff irq 23 at device 29.0 on pci0
ehci1: [ITHREAD]
usbus1: EHCI version 1.0
usbus1 on ehci1
isab0: <PCI-ISA bridge> at device 31.0 on pci0
isa0: <ISA bus> on isab0
atapci0: <Intel Lynx Point SATA300 controller> port 0xf0d0-0xf0d7,0xf0c0-0xf0c3,0xf0b0-0xf0b7,0xf0a0-0xf0a3,0xf060-0xf07f mem 0xf7d32000-0xf7d327ff irq 19 at device 31.2 on pci0
atapci0: [ITHREAD]
atapci0: AHCI called from vendor specific driver
atapci0: AHCI v1.30 controller with 6 6Gbps ports, PM not supported
ata2: <ATA channel> at channel 0 on atapci0
ata2: [ITHREAD]
ata3: <ATA channel> at channel 1 on atapci0
ata3: [ITHREAD]
ata4: <ATA channel> at channel 4 on atapci0
ata4: [ITHREAD]
pci0: <serial bus, SMBus> at device 31.3 (no driver attached)
pci0: <dasp> at device 31.6 (no driver attached)
acpi_button0: <Power Button> on acpi0
acpi_tz0: <Thermal Zone> on acpi0
acpi_tz1: <Thermal Zone> on acpi0
acpi_hpet0: <High Precision Event Timer> iomem 0xfed00000-0xfed003ff on acpi0
Timecounter "HPET" frequency 14318180 Hz quality 900
atrtc0: <AT realtime clock> port 0x70-0x77 irq 8 on acpi0
atrtc0: Warning: Couldn't map I/O.
uart0: <16550 or compatible> port 0x3f8-0x3ff irq 4 flags 0x10 on acpi0
uart0: [FILTER]
uart0: console (115200,n,8,1)
pmtimer0 on isa0
orm0: <ISA Option ROM> at iomem 0xc0000-0xcffff pnpid ORM0000 on isa0
sc0: <System console> at flags 0x100 on isa0
sc0: VGA <16 virtual consoles, flags=0x300>
vga0: <Generic ISA VGA> at port 0x3c0-0x3df iomem 0xa0000-0xbffff on isa0
ata0: <ATA channel> at port 0x1f0-0x1f7,0x3f6 irq 14 on isa0
ata0: [ITHREAD]
ata1: <ATA channel> at port 0x170-0x177,0x376 irq 15 on isa0
ata1: [ITHREAD]
coretemp0: <CPU On-Die Thermal Sensors> on cpu0
est0: <Enhanced SpeedStep Frequency Control> on cpu0
p4tcc0: <CPU Frequency Thermal Control> on cpu0
coretemp1: <CPU On-Die Thermal Sensors> on cpu1
est1: <Enhanced SpeedStep Frequency Control> on cpu1
p4tcc1: <CPU Frequency Thermal Control> on cpu1
Timecounters tick every 1.000 msec
IPsec: Initialized Security Association Processing.
ipfw2 (+ipv6) initialized, divert loadable, nat loadable, rule-based forwarding disabled, default to deny, logging disabled
usbus0: 480Mbps High Speed USB v2.0
usbus1: 480Mbps High Speed USB v2.0
ad4: 953869MB <WDC WD10EZEX-00RKKA0 80.00A80> at ata2-master UDMA100 SATA 6Gb/s
ad6: 1907729MB <ST2000DL003 9VT166 CC32> at ata3-master UDMA100 SATA 6Gb/s
ugen0.1: <Intel> at usbus0
uhub0: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus0
ugen1.1: <Intel> at usbus1
uhub1: <Intel EHCI root HUB, class 9/0, rev 2.00/1.00, addr 1> on usbus1
SMP: AP CPU #1 Launched!
Root mount waiting for: usbus1 usbus0
uhub0: 2 ports with 2 removable, self powered
uhub1: 2 ports with 2 removable, self powered
Root mount waiting for: usbus1 usbus0
ugen0.2: <vendor 0x8087> at usbus0
uhub2: <vendor 0x8087 product 0x8008, class 9/0, rev 2.00/0.04, addr 2> on usbus0
ugen1.2: <vendor 0x8087> at usbus1
uhub3: <vendor 0x8087 product 0x8000, class 9/0, rev 2.00/0.04, addr 2> on usbus1
uhub2: 6 ports with 6 removable, self powered
Root mount waiting for: usbus1 usbus0
uhub3: 8 ports with 8 removable, self powered
ugen0.3: <American Power Conversion> at usbus0
Trying to mount root from ufs:/dev/ad4s1a
fuse4bsd: version 0.3.9-pre1, FUSE ABI 7.19


2018/08/15

Spring BootでJDBCの設定を確認する

JDBCの設定は難しい

なかなか避けて通れないDB。JavaでDBを使うなんてよくあることだし、ググれば簡単かと思いきや、まともに使うための設定が書いてあるページにたどり着くのは困難。サンプル通りに作ったのに、1日経ったらエラーで止まっているなんてのはよくある話。

地雷が何箇所にもあるので、トラブルシューティングに従ってやってみたところで、原因が違えば何の効果もない。が、意図した通りに設定されているということに確証が持てなければ、何をやっても無駄だ。というわけで、設定を確認する方法をまとめてみる。

Tomcat DBCPを設定する

JDBCというか、Connection Pooling。Javaなら普通Poolingするでしょうから、Spring Boot + Tomcat DBCP + MySQLのパターンに絞ってみる。

Tomcat DBCP(Tomcat JDBC Pool)については、Commons DBCPを超えるTomcat JDBC Poolとは (1/2):Tomcat 7の新機能で何ができるようになるのか?(番外編) - @ITがわかりやすい。

Spring Boot は Tomcat DBCPをサポートしているので、設定でうまくやれる。はずなのだが、Spring Bootのバージョンによって設定パラメータ名が変わっているので、どのバージョンについて話しているのかを確認しないと、悩むことになる。

MySQLのtime out系はよく見かけるトラブル。

  • Lost connection to server during query
  • MySQL server has gone away
といったものが、よく食らうエラー。

time outに関係するパラメータをうまく設定すれば解決できるのだが、Spring Bootだと、パラメータ名何だったっけ?ということになる。特に、別々のDB Serverに同時に接続できるよう、パラメータ名を変更した場合はわからなくなりがち。

設定内容を表示させる

設定内容をログに出すなり、APIのレスポンスとして返すようにするなりすれば、確認できる。というのが、Spring Boot configuration for Tomcat’s pooling data source | The Art of Codeに書かれている。具体的なコードが書かれているので、英語アレルギーでもコードだけ見ればわかるだろう。
DataSourceオブジェクトを作って、そのプロパティを表示するコードなのだが、どんな設定がされているのか、このアプローチなら確かに確認できる。

タイムアウトに対処する設定

ググるとtestOnBorrowをセットすればよいとかvalidityQueryをセットしろとか見つかるが、不十分な設定を書いている記事も多い。まだブラウザで開いていたページは

といったところ。

ネットワークが絡んでくるのでシステム構成の違いによる影響が大きく、一般化してまとめるのが難しい、というか、具体的でなくなってしまうのかな。ただ、「使う前or定期的に DBにクエリーを投げて、接続が使える状態かどうか確認する」というアプローチなので、それを実現するための設定を行っていくというのが解決方法になる。



2018/05/20

ポケモンGOにmoto G5sはパワー不足

画面が大きめのスマホが欲しい

今までiPhone SEでポケモンGOをやっていたのだが、画面がちょっと小さい。メールやスケジュールの文字が見難く感じることが多くなってきたので、画面が大きいスマホを買うことにした。

最近のAndroidは持っていなかったので、Androidでほどほどのお値段で外国製の中からチョイス。国産メーカーだと、アップデートがすぐに終わってしまって、データ盗られ放題のまま使わざるをえないことになってしまうからね。
IIJmioでキャンペーンをやっていたので、モトローラ Moto G5sに決定。

moto G5s開封の儀

パッキングはもうスマホでおなじみの形式。


ふたを開けると

裏はすっきり。カメラ部分の出っ張りは気になる。

simフリーだからIIJ mioで扱っている

当然、IIJ mioのsimを入れても、問題なく認識される。ちなみに、タイプD。
サイズはnanoなので、iPhone SEで使っていたsimを持ってきた。

ポケモンGOはちょっとカクカクする

ARモードも使えるのだが、ジムバトルでポケモンを選ぶ画面のスクロールがもたつく。また、ジムの画面から通常のフィールド画面に戻るとき、画面の描画が半分くらいでいったん止まる。後者はともかく、前者は意図しないポケモンが選ばれることがあり、ちょっとイラつく。
G5から画面を大きくしたので、処理が追いつかないのかもしれない。

moto g5sのケースと保護フィルム

スマホには付き物。特殊素材で衝撃を吸収! 『衝撃吸収【光沢】保護フィルム Moto G5s』Moto G5S ケース TopACE 超スリム クリア TPU ソフトケース 落下防止 指紋防止 耐スクラッチ全面保護 Moto G5S対応をチョイス。

もう少し小さいのがいい

5.2インチサイズはちょっと大きい。胸ポケットに入るか入らないかくらいなので、もう一回り小さくてもいいかなぁというのが正直なところ。世界市場的には、ニーズのない大きさなのかなぁ?



2018/04/29

遅いSQLをあぶり出す

犯人は誰だ

DBが遅いという。サーバのスペックや処理内容、開発会社のレベルを考えると、どうも設計やSQLに問題がありそうだ。
「DBアクセスが遅い」と文句を言っても「サーバのスペックをあげてくれ」としか回答してこないレベルなので、ボトルネックになっているSQLを調べることにした。

スロークエリの調べ方

Postgresだと、 スロークエリの分析 | Let's Postgres というページにまとまっている。
しかし、

  • Amazon RDS for PostgreSQL | AWSって、pg_stat_statements使えたっけ?
  • スロークエリって、何秒以上をログ出力するようにすればいい?そのクエリって、頻繁に使われるの?
といった問題があり、今回は保留。

MySQLの場合、 Kazuho@Cybozu Labs: MySQL のボトルネックを統計的に監視・解析する方法で紹介されている、GitHub - kazuho/mprofile: http://developer.cybozu.co.jp/archives/kazuho/2009/07/mysql-539d.htmlが使える。 Postgres向けを探したが、調べ方がよくなかったのか、見つけられなかった。

pg_stat_activityを使う

pg_stat_activityで現在発行中のsqlを見る - メモス\(^o^)/。これを定期的に実行すれば、よく実行されるSQLがあぶり出される。
必要な情報をまとめると、実行するSQLは

SELECT now(),query_start, query FROM pg_stat_activity WHERE state='active';
でOK。cronに書いて出力をファイルにリダイレクトすれば、後でゆっくり分析できる。

どのクエリとどのクエリが同じなのか、判断する必要がある。とりあえずはよく出てくるSQLのうち、query_start - now()が大きな値になっているものを調べるのがよさそう。大体の時間も見えてくるので、スロークエリを設定するときにも役に立つ。

作り逃げに注意

よろしくないSQLも、データ量が少ない頃は問題が見えてこないことが多い。開発を外注して自社で運用なんてスタイルをやっていると、こういう爆弾をつかまされることになりがちだ。



2018/02/11

簡単! Mackerel Pluginの作り方

Mackerel、それは鯖管のためのサービス

Mackerel(日本語では鯖)はいわゆる監視サービス。監視データを送るagentを動かせば、データを受け取ってグラフにし、指定した条件になった場合にはアラートをメールやチャットで送ることができる。

監視対象項目はプラグインで拡張することができる。公式のPluginも用意されており、有名どころのミドルウェアやWebのアクセス監視はカバーされている。

プラグインの作り方

「アプリケーションのログを監視したい」「公式プラグインでは用意されていないxxxというソフトのログを監視したい」という場合、プラグインを作る必要がある。ただ、プラグインはSensuと互換性があり、また、MuninのPluginを動かすためのプラグインもあるので、それらをプラグインを探すのはアリだと思う。

とはいえ、なければ作る必要がある。

名前 値 時刻
を標準出力に出せばよいので、作ると言っても、基本的にはそれほど大げさなものにはならない。
名前
Mackerelのグラフでは、「custom.名前」で表示される。
  • ピリオドを2つ以上含むこと
  • 一番右のピリオドより右側にあるものが、グラフになる
値。測定値とか、グラフにする値。
時刻
値はいつの時点だったかを示す時刻。過去の時刻でもよい。
Bash scriptだと
#!/bin/bash
NAME='sample.script.test1'
D=$(date +%s)
V=1
echo $NAME $V $D
でOK。適当に名前をつけて(ただしtestという名前はやめておくこと)実行できるようにchmodしておく。
agentの設定ファイルであるmackerel-agent.confの最後の方に
[plugin.metrics.sample]
command = "上記scriptのフルパス"
と書き足してagentをreloadすれば、準備完了。2,3分でグラフが描かれる。

プラグイン自体、標準出力に値を出力するだけなので、debugもしやすい。ただ、実行時間が1分に制限されているので、ネットワーク越しに値を持ってくるときなどは注意しておいた方がよい。

ここまで抑えると、他人の書いたプラグインも読みやすくなる。例えば、mackerelでWeb Siteのステータスをチェックするも、このルールの中で行っているし、さらに、「名前」「値」「時刻」を複数行出すのもOKだということが読み取れる。

アプリのログを監視する

「〜という文字列が現れたら警告してほしい」というのであれば、check-log プラグインで十分対応できる。出現回数に対してアラートを出すまでの閾値も設定でき、柔軟性も高い。
しかし、「出現の傾向をグラフ化したい」となると、プラグインを作る必要がある。

単純にログファイルをgrep -cしてしまうと、累積値になってしまう。そこで、監視対象の期間に絞り込んだログファイルを一時的に生成する。

#!/bin/bash
ORG_LOG="/var/log/sample.log"
LOG="/tmp/$(basename $0).tmp.$$"

TARGET="$(date +%Y%m%d%H%M -d '1 minute ago')"
grep $TARGET $ORG_LOG > $LOG

NAME='sample.script.test2'
D=$(date +%s)
V=$(grep -c '対象文字列' $LOG)
echo $NAME $V $D

rm -f $LOG
ポイントは、TARGET=の行とその次のgrep。
ログファイルと同じ日付フォーマットを、dateコマンドで出力させる。ただし、「秒」は出力させない。そうすることで、1分の間に出力されたログに絞り込むことができる。
もう1つ、'1 minute ago'オプション。単純に時分までで絞り込むと、プラグインが10秒くらいで起動された時、対象のログは10秒分しか存在していないことになってしまう。1分程度のズレを許容すればこの2行で1分分のログを抽出できるので、妥協するかどうか、判断が必要になるところではある。そもそも、そこまで正確な値が必要であれば、アプリケーション側でそういったメトリクス収集の口を用意すべきだとは思うが。

細かい設定も可能だが

単純に「名前」「値」「時刻」を出力するだけだと、グラフのタイトルに「custom」というprefixがついてしまう。もちろん、これを回避する方法はあるのだが、プラグインが少し複雑になってしまう。ホストのカスタムメトリックを投稿する - Mackerel ヘルプにちゃんと記載されているので、頑張りたい人はそちらを見てほしい。あ、「名前」「値」「時刻」はタブで区切るべきなのか。ヘルプはちゃんと読まないと。

お決まりの一文。本サイトに掲載する情報に関しては、正しいものを提供することを務めていますが、掲載内容から、いかなる損失や損害などの被害が発生しても、責任は負いません。自己責任でご活用ください。



2018/02/04

無線LANに繋げるEthernet子機を新調

Ethernetアダプター

NURO光のONUは2階、WindowsデスクトップマシンやNASのある自室は1階で、LANケーブルを引き延ばすのは無理なため、無線LANでつないでいる。今までは NEC Aterm WL300NE-AG (Ethernet子機) PA-WL300NE/AGでつないでいたが、壊れたので、新しくNEC Wi-Fiホームルーター Aterm ブラック PA-WG1200HS2を購入した。2.4GHzでも5GHzでも、NURO光のONUにつながっている。

有線LANを無線LANに繋げるときは、Ethernet子機を使う

メーカーによって呼び方が異なるが、NEC Atermシリーズでは「子機」という。USB接続のWifiアダプターを子機と呼ぶメーカーもあって非常にまぎらわしいのだが。親機との接続については、自社製品とだけ確認するのが普通で、無線機能をもったONUと接続できるかどうかは、がんばって調べるか自ら人柱になって試すしかない。

NURO光のONUとしてHG8045Qを使っているので、試した結果、2.4GHzでも5GHzでも接続できた。当然、自分の環境ではうまくいったが、どの環境でもうまくいくという保証はない。この結果は自己責任で判断するものであり、うまくいかなくても誰かが責任を負うようなものではない。

子機モードでのWifi設定

子機モードの場合、LANケーブルの途中が無線になったようなイメージで使うことになるため、子機そのものにアクセスすることはない。

どうやって設定を行うのだろうと思ったら、ユーザーズマニュアルにちゃんと書いてあった。「らくらく設定ボタン」を押しながら電源を入れると強制的にDHCPサーバが起動するので、Webの画面から設定できる。設定が終われば内容を反映してから再起動して、DHCPサーバは止まる。

WindowsやAndroid, iOSでは、探し出すアプリがあるようだ。が、そうそう設定画面を呼び出すようなものでもない。有線LANがあれば「ボタンを押しながらスイッチオン」で十分だ。


HG8045jとWL300NE-AG も繋がった

NURO光のONUは、最初、HG8045jだった。無線が速くないので交換してもらったのだが、この時もWL300NE-AGで繋いでいた。WL300NE-AG も速くないのだが。



2018/01/03

2018年年賀状


今年もよろしくお願いします。