Redmineチューニングの実際と限界を読んで。
プロジェクト分割すれば良いだけなのに…、200万チケットを1つのRedmineに入れる必要があるって、恐ろしいです…。
メモ: 技術系の話はFacebookから転記しておくことにした。
目次: Linux
ずっと気づいていなかった自作ARMエミュレータememuのバグを直しました。
エミュレータは、内部に簡易ブートローダを持っているのですが、この簡易ブートローダが変なパラメータをLinuxカーネルに渡していたため、Linuxのブート時に「Ignoring unrecognised tag 0x00000000」と怒られていました。
[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.18.11 (katsuhiro@falcon) (gcc version 4.9.1 20140710 (prerelease) (crosstool-NG linaro-1.13.1-4.9-2014.07 - Linaro GCC 4.9-2014.07) ) #1 Fri Apr 17 03:18:38 JST 2015 [ 0.000000] CPU: ARM926EJ-S [41069260] revision 0 (ARMv5TEJ), cr=00003137 [ 0.000000] CPU: VIVT data cache, VIVT instruction cache [ 0.000000] Machine: ARM-Versatile PB [ 0.000000] Ignoring unrecognised tag 0x00000000★★★これ★★★ [ 0.000000] Memory policy: Data cache writeback [ 0.000000] On node 0 totalpages: 16384
古き時代からARM LinuxではATAGという仕組み(ATAGの仕様はここにあります)でカーネルのロード位置、InitramFSのイメージの位置、カーネルのコマンドラインなどをブートローダからカーネルに渡しています。
このうち、もうパラメータはない、すなわちパラメータの配列の終端を示すためのATAG_NONEの渡し方が間違っていました。わざわざ仕様書にも0x2を渡すなよ、0x0だぞ(※)と強調して書かれているのに、サイズに0x2を渡していました。マヌケです…。
このバグに気づいたとき、パラメータの終端が無い状態でも動くのか、さすがLinuxなどとアホなことを思っていたのですが、実はRAMの初期値が0だったため、パラメータの配列の終端を突き抜けた後に、0x00が4連続する部分(ATAG_NONEと同じ意味で解釈される)で解析が終了していただけでした。
つまり、今まで動いていたのは偶然!ってことですね。
このバグは現状では問題を引き起こしませんが、今後RAMを初期化しないが、ブートローダは通る、と言う処理を実装すると問題が起きます。例えば、リセット例外によるソフトリセット処理が当てはまりそうです。恐らくRAMの内容に応じてランダムにクラッシュする厄介なバグとして表面化するでしょう。
(※)引用するとThis tag is used to indicate the list end. It is unique in that its size field in the header should be set to 0 (not 2). とのこと。
目次: 自宅サーバー
前回(2015年3月9日の日記参照)はGPSモジュールをPCと接続して、情報を取得するところまで試しました。
今回はGPSモジュールからの時刻情報を使ってNTPサーバの時刻を合わせたいと思います。
設定はとても簡単で、下記をntp.confに書き加えてntpdを再起動させるだけです。当然ですがgpsdも起動している必要があります。
server 127.127.28.0
fudge 127.127.28.0 refid GPS
設定の127.127というのは、決まり文句(ネットワーク上のサーバではない、くらいの意味だと思う)で、その後の28.0に意味があります。この28.0は共有メモリを使って時刻を取得するドライバを使ってくださいね、という意味になります(NTPのドキュメント参照)。
なぜここで急に共有メモリが出てくるのか?というと、実はgpsdとntpは共有メモリを介して通信しているからです。
# ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status ------ Semaphore Arrays -------- key semid owner perms nsems # /etc/init.d/gpsd start Starting gpsd (via systemctl): gpsd.service. # ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x4e545030 3375104 root 600 96 1 0x4e545031 3407873 root 600 96 1 0x4e545032 3440642 root 666 96 1 0x4e545033 3473411 root 666 96 1 0x47505344 3506180 root 666 31616 1 ------ Semaphore Arrays -------- key semid owner perms nsems # /etc/init.d/ntp start Starting ntp (via systemctl): ntp.service. # ipcs ------ Message Queues -------- key msqid owner perms used-bytes messages ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0x4e545030 3375104 root 600 96 2 ★★1 → 2に増えた ★★ 0x4e545031 3407873 root 600 96 1 0x4e545032 3440642 root 666 96 1 0x4e545033 3473411 root 666 96 1 0x47505344 3506180 root 666 31616 1 ------ Semaphore Arrays -------- key semid owner perms nsems
上記の実行結果を見るとgpsdを起動する前と、起動した後で、共有メモリの領域数が増えていることと、ntpを起動した後で、共有メモリへのアタッチ数(nattch)が1から2になっていることがわかると思います。
実際NTPサーバがGPSから時刻を取得できているか、確認するときはntpqコマンドを使います。
remote refid st t when poll reach delay offset jitter ============================================================================== 127.127.28.0 .GPS. 0 l - 64 0 0.000 0.000 0.000 *127.127.1.0 .LOCL. 10 l 17 64 3 0.000 0.000 0.002
本来、127.127.28.0の方に * が付く(* は時刻合わせに使っているという意味)はずなのですが、調子が悪くてGPSで時刻を合わせている状態になりませんでした。
調べてみると、どうもGPSレシーバが壊れたようでxgpsで見ても全く衛星を捕捉していません。6000円くらいしたのに…なんてこった…。
さらにgpsdの動作確認済みハードウェアリスト(ハードウェアリストへのリンク)の中に、私が買ったGlobalsat BU-353-S4も載っており「感度悪いし、衛星の捕捉も遅いし、絶対買わない方が良いぜ(※)」と紹介されていました。
言われてみれば、かなり開けた窓際、しかも数センチ近くまで持っていかないと衛星捕捉せず、設置場所探しに大変苦労していたのですが、まさかここまでボロクソに書かれるほどのハズレ製品だったとは…。
壊れたのと合わさって、二重のショックです。せっかく買ったのに…ううーん。
(※)引用すると、Has poor sensitivity and takes a lot longer to cold-start than the vendor claim 45 of 45 seconds. Gary Miller rates this device "DO NOT EVER BUY ONE!" だそうです。
< | 2015 | > | ||||
<< | < | 05 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |
合計:
本日: