X



bbs.cgi再開発プロジェクト6

レス数が1000を超えています。これ以上書き込みはできません。
2005/04/10(日) 16:15:47ID:a6rtBqIi0
peko鯖の稼動によりボトルネックの一つである事がより明らかになった
bbs.cgi作り直しプロジェクトです。

【開発環境の工事現場】
また挑戦。@2ch掲示板  http://dso.2ch.net/myanmar/
また挑戦2。@2ch掲示板 http://dso.2ch.net/yangon/

関連スレなどは >>2-5 くらい
2005/10/25(火) 08:36:46ID:x9TmyNgO0
荒らし対策と規約承諾を別々のクッキーで扱うのが面倒なら、
>>910をしつつ、投稿ボタンを全て「規約を承諾して書き込む」
にして、
もし ($FORM{'submit'} が "承諾云々" ではない) なら
{DispError("ERROR!","規約を承諾しないと投稿できません!");}
とか

専ブラが全滅だけどね。対応されるまで。
2005/10/25(火) 08:39:35ID:PSbrr/As0
>>919
2ちゃんねる側が原告ならそれはありだけど、
被告側ではその意見はあまり意味がないな。

裁判ネタはこれ以上はスレ違い。
2005/10/25(火) 09:19:32ID:8gkXZmw80
まあ、最近インスパイアのこともあってぴりぴりしてるから
これを機に徹底的に話し合って詰めた方がいいかもね。
2005/10/25(火) 21:03:44ID:Y9ML3vBs0
>>920
専用ブラウザに対しては、UserAgentを見て従来通りの動作にする、というのはどうでしょう。
それを恒久策にするか、移行が済むまでにするかは、考えないといけないけど。
924root▲ ★
垢版 |
2005/10/25(火) 21:25:44ID:???0
というか、あんなに防御していたのに、
スレッドが80超えちゃってたのがなぁ。

たぶんほとんど同時に何十本とスレ立て要求が来て、一気に追い込まれたんだと思われ。

何か、工夫が必要ですね。
スレ立て処理を実行中の船は、スレ立て処理をしないようにするとか。

グローバル変数でできるような気がするので、後で、考えてみよう。
2005/10/26(水) 01:25:19ID:KEQJ4CBE0
>>923
Monazilla/2.0 ですか?
926root▲ ★
垢版 |
2005/10/26(水) 11:45:03ID:???0
うーむ、同じスレッドキーのスレができないようにするところって、
激しくうーむなような。
2005/10/26(水) 12:22:51ID:s6PZNUUX0
どうしたの?
2005/10/26(水) 13:01:14ID:tPRUqC8Y0
安易なロック方式として、スレを立てるところで
どこか(板単位で分離が好ましい?)にunixtime%閾値をファイル名として/dev/nullからでもsymlinkを貼ってみて、
失敗したらスレたて拒否。成功したら建てる。
ガベージコレクトのタイミングで一番新しいヤツ以外を削除するようにすればおっけ。
マルチスレッド/タスクを考慮するならこれが一番コストがかからないと思いますがどうです?
閾値はスレたての最大間隔ね。最小1秒になることもあるけど2スレ連続ならまぁ許容範囲内ではないかと。
2005/10/26(水) 13:03:24ID:BcSDlqwC0
ん?
Perlでのまともなlockの方法って、2年ほど前の再開発スレでrootさんが話題にしてましたよね。
そのレベルは脱した上で「うーむ」なことに成っているのだと解釈。
2005/10/26(水) 13:24:34ID:s6PZNUUX0
ほぼ同時にスレ立て要求→同時に数十本もスレ立っちゃった→スレッドキーみんな同じだ→しかも今夜が山だ

こんなところ?
931root▲ ★
垢版 |
2005/10/26(水) 13:29:31ID:???0
今の bbs.cgi は、同じスレッドキーのやつが立たないようにするコードが
ちゃんと入っているです。

ようは、その実装方法がうーむだと。
932root▲ ★
垢版 |
2005/10/26(水) 13:51:08ID:???0
do {
#サブジェクトがあれば新規スレなのでキーを現在に設定
$GB->{FORM}->{'key'} = $GB->{NOWTIME};
#.datファイルの設定
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";

} while ( -e $DATAFILE ) ;

これって、$DATAFILE が既に存在してたら、無限ループに陥るんではないかしら。
2005/10/26(水) 14:15:06ID:qwHTUNtV0
不動楽さんが入れたやつですね


2chの動作報告はここで。 パート15
http://qb5.2ch.net/test/read.cgi/operate/1090485214/676-685

==========================================
676 削除車 ★[sage] 04/11/01 23:25:56 ID:???
お疲れさまです。ちょっとご相談があります。

最近ニュース速報(VIP)が、非常に板飛び回数が多いです。
少しお話を窺ったところ、同じタイミングでスレが立ったときに合体を起こして、板が飛ぶみたいです。
お手数ですが、ちょっとcgiの方を確認していただけますか?
(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)

よろしくお願いします。


★板のスレ一覧復帰&修正依頼21★
http://qb5.2ch.net/test/read.cgi/operate/1096548247/677-682


679 不動楽 ★ [sage] 04/11/02 00:45:12 ID:???
>>676
原因らしき個所は炙り出せたのですが、
その変数にからむ処理を上から眺めていきますので、
少しお時間を頂きたいです。

>(それとも一般的なことで、VIPでたまたま多く発生しているだけなんでしょうか)
ex7だけでなく、全板のbbs.cgiで同じことが起こる可能性があるようです。

684 root▲ ★ [sage] 04/11/02 02:08:27 ID:???
直すときには、安易な flock() は控えてほしいなぁと強くおながいしておきますです。

685 不動楽 ★ [sage] 04/11/02 02:13:12 ID:???
>>684
排他処理をしていないのが原因、というわけではないので大丈夫かと思うです。
==========================================
934root▲ ★
垢版 |
2005/10/26(水) 14:19:31ID:???0
それについて書こうと思ったら、>>933 が。

それは、これですね。
上記よりも後、最後ところでやっているです。

if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
}

ということで、それはクラシックさんが入れたところではないと思います。
昔からあったところだと思う。

*以下推測*

たぶん、昔は do 〜 while のところでもtime; していたんでしょう。
それなら、1秒経てば条件が変わります(ループを抜けるかは別)。
935root▲ ★
垢版 |
2005/10/26(水) 14:20:57ID:???0
コピペみすった。

コメントつきなので、ほぼ間違いないです。

#==================================================
# 板飛び回避策
#==================================================
if($GB->{FORM}->{'subject'} ne "" && -e $DATAFILE){
&DispError2($GB,"ERROR!","ERROR:板飛びそうなので、またの機会にどうぞ。。。");
}
936root▲ ★
垢版 |
2005/10/26(水) 14:39:15ID:???0
で、ここの制御を変えようと思うわけです。
安易に、

・live系は既にあったらごめんなさい
・他はスレッドキーを+1しながら、最大3回ぐらい試してみる

ってことにしようかなと。
937root▲ ★
垢版 |
2005/10/26(水) 16:22:21ID:???0
BBS.CGI - 2005/10/26

$GB->{FORM}->{'key'} = &mumumuAllocateThreadKey($GB);
$DATAFILE = $GB->{DATPATH} . $GB->{FORM}->{'key'} . ".dat";

にした。
で、mumumu AllocateThreadKeyの中身は >>936 にしたつもり。

これで、

・bbs.cgi謎の暴走
・スレ立て混雑時にサーバ劇重

が、少しでも改善されるといいかなと。
2005/10/26(水) 16:27:27ID:tPRUqC8Y0
スレッドキーは毎秒かわるんでしたっけ、でしたらこんなのはどうですか?

0. ロックの待ち番号を0で初期化

1. ロックの待ち番号をファイル名にして/dev/nullからsymlinkしてみる
 成功; → 6へ

2. ロックの待ち番号を1カウントアップ

3. ロックの待ち番号最大値を超えてるかチェック
 超えてる: → 建てたい人大杉表示にして諦める

4. 1秒まつ

5. 1へ

6. ロックの待ち番号が0か?
 はい: 9へ

7. 0.5秒待つ。

8. ロックの待ち番号-1をsymlinkしてみる
 失敗: → 7へ
 成功:
ロックの待ち番号をunlink
ロックの待ち番号を-1
6へ

9. スレたて処理
939root▲ ★
垢版 |
2005/10/26(水) 16:30:25ID:???0
>>938
最初はそういうのを考えていたんですが、
1秒とか0.5秒とか待つのが、いやだったです。

スレッドキーは所詮本当の時間とあっている必要はないので、
・live系はごめんなさい
・通常系は 0 +1 +2 を試して、だめならごめんなさい

ぐらいのいい加減さにして、一刻も早くbbs.cgiに終わっていただくことにしました。
2005/10/26(水) 16:45:26ID:tPRUqC8Y0
それだと、多台数とかからスレたて攻撃が同時に来たときにやっぱり被害が起こることは避けれないと思いますがどうでしょう。
2005/10/26(水) 16:50:01ID:BcSDlqwC0
計算量がO(n * log n)で収まれば収束しないか?
2005/10/26(水) 16:51:55ID:/5B2u2B30
メモリ上に前回のスレキーを持たせたファイルを置いてそれを参照
とかは無理だろうしなぁ…
(素人案だし毎回読み込みとか(ry)
943root▲ ★
垢版 |
2005/10/26(水) 17:00:02ID:???0
>>940
if ( ! -e datファイル ) {
return それでOKよん;
} elsif ( ! live系 ) {
for ( $i = 0; $i < $maxtries; $i++) {
スレッドキーを一つずつ増やして存在チェックし、なかったやつを
return これ使ってちょ;
}
&error(ごめんなさい);

って、なっています。

というわけでおっしゃるとおり、タイミングにより突破もありえます。

その場合は、>>935 でひっかかると。
でもそれにしても、ほんとうは完璧じゃないです。

雪だるま作戦では、このへんはバックエンドプロセスに依頼する形になるので、
その時に、きちんと対応することになるかなと。
944root▲ ★
垢版 |
2005/10/26(水) 17:03:08ID:???0
てなわけで、-e でdatファイルの存在をチェックしていたり、
924の処理のところみたいに utime でdatのタイムスタンプ更新したりすることは
雪だるま環境ではそのままではむりぽなわけで、
そういったAPIを、入れ込んでほしいということなわけです。

一つ海外出張がキャンセルになってちょっと落ち着いたので、
このへんを、ぼちぼちあっちですすめようかなと。> SunOSさん
945root▲ ★
垢版 |
2005/10/26(水) 19:05:46ID:???0
で、>>937 により「ごめんなさいリミッター第二弾」が実装されました。
どのくらい、発動しているんだろうか。
2005/10/26(水) 22:28:35ID:ICyD85HJ0
ん〜と,現在の bbsd ではスレ立て時の key をインクリメントしながら一定回数(現在は16)
リトライするようになっています.その際,open() を O_CREAT|O_EXCL フラグ付きで
呼び出しているため,ファイルの存在確認と生成はアトミックになっているはずです.

当初はスレ立て時の key としては bbsd 側の現在時刻を用いていましたが,
それだと headline に渡す key とのずれが生じる問題も発生したため,
現在は bbs.cgi 側から渡された key を使用するようになっています.
ただ,上記の key のインクリメントが発生するとやはりずれが生じることに
なるので,そこの調整をする仕組みが必要になりますかね.
2005/10/26(水) 22:37:27ID:ICyD85HJ0
単純に,bbsd 側ではリトライせず,key をインクリメントした上でのリトライは
bbs.cgi 側に任せるという形でもいいんですかね.同じ key を持つ dat が
存在した場合,bbsd は EEXIST に相当するエラーメッセージを返すことになるんで.
948root▲ ★
垢版 |
NGNG
>>946-947
なるほど、なるほど。

bbsdについては、そのうちoperateにスレ立てるかも。
(いろんな意味でhtml化されてほしいし)
949root▲ ★
垢版 |
NGNG
で、スレ立てのAPIの戻りで、実際に立ったスレのキー(だめなら-1)を、
戻すとかすればいいと思うです。>>946-947
2005/10/27(木) 01:37:41ID:MHLp6DNM0
ロックのループにはまった時はスレキーとかに使うUNIX時間なんかを
新たに取り直した方がよくね?
でもスレ立て処理は排他ロックさせずに複数同時進行してそうだし、
ロックのループが1秒待ちでもなさそうだから関係ない話か。
2005/10/27(木) 19:57:03ID:SzSv4IzM0
>>949 成功時は key,失敗時はエラーメッセージを返し,戻り値が
数値か文字列かを bbs.cgi 側で判定してもらうというのはどうでしょうか?
スレ立てが失敗する原因は EEXIST 以外にもあり得るので
(といっても実際はまれでしょうが),エラーの内容がわかった方が
異常発見もしやすくなるかと思いますし.
952root▲ ★
垢版 |
NGNG
>>951
悪くないと思いますです。

週末あたりから、APIを詰めていくスレをoperateに立てようかと。
ほんじつは、ここまで。
953root▲ ★
垢版 |
NGNG
ということで、立てました。

【雪だるま】bbsd⇔各cgi間のI/F仕様について考え・詰めていくスレッド
http://qb5.2ch.net/test/read.cgi/operate/1130482779/

ぼちぼち、すすめていこうかと。
2005/10/29(土) 12:11:11ID:nNATzveB0
てすと
955
垢版 |
2005/10/30(日) 04:51:30ID:R0mqD16u0
キャップの▲ってなんか意味あるとですか?
2ch全板で合計して 平均何秒ごとくらいにスレが立っているのでしょうかえ?
2005/10/30(日) 14:29:53ID:xwQs58530
>>955

  質問スレ3@運用情報板  
http://qb5.2ch.net/test/read.cgi/operate/1128955883/
957root▲ ★
垢版 |
NGNG
うーむ、

$GB->{MD5DATE} = sprintf("%04d_%02d_%02d",
substr($year + 1900, -2), $mon + 1, $mday);

これ、substrのところがたぶん -4 の間違いなんだと思うけど、
ここを変えるとこのあとのIDの種ファイルを更新するところで、
「日付変わった」と思われて、IDが変わっちゃうですね。

まずoperate2で試して、ID変わっちゃうとしたら、
23:00過ぎに、やることにしよう。そうしよう。
958root▲ ★
垢版 |
NGNG
これ直したら、SunOS さんのからの質問 [1-2] のところの仕様が確定すると。
959root▲ ★
垢版 |
NGNG
http://qb6.2ch.net/test/read.cgi/operate2/1108090447/789-791

ということで、23:40〜45 あたりにやろうかと。
2005/10/31(月) 18:52:32ID:e+pnaIH20
そもそも-4というよりは、
 × substr($year + 1900, -2)
 ○ $year + 1900
みたいなかんじっぽいな
%04dに文字列渡してどうするんじゃと
961root▲ ★
垢版 |
NGNG
>>960
そのように変更するです。

# Perl、にがて。
962root▲ ★
垢版 |
NGNG
その直上のここは、どうすればいいべか。

$GB->{DATE} = sprintf("%02d/%02d/%02d %02d:%02d:%02d",
substr($year + 1900, -2), $mon + 1, $mday, $hour, $min, $sec);
2005/10/31(月) 18:56:20ID:tkwMzh3I0
>>957
2chが西暦10000年まで存在してるとは考えにくいし
substrする必要はないと思います
2005/10/31(月) 18:59:17ID:tkwMzh3I0
ってか  $GB->{DATE}  って何に使うんですか?
2005/10/31(月) 19:00:53ID:tkwMzh3I0
>>957が -4 だと思ったのはなぜ?
その部分だけ見た場合は、現実的(2chがいつまで存在するか)に考えて、 -4でも-2でも変わんないと思うし
2005/10/31(月) 19:01:46ID:e+pnaIH20
>>962
ん?なんだそら?それ現在dat及びに出力される形式と違ってるみたいけど
どっかべつのところでつかってるんだろか

どうしてもそれで直したければ
substr($year + 1900, -2) → $year % 100
てところじゃないんすかね
967root▲ ★
垢版 |
NGNG
投稿日: とか、あと内部的にいくつか。
968root▲ ★
垢版 |
NGNG
>>965
IDを格納するところで、YYYY_MM_DD を日付として使っているです。
で、0005_10_31 というのは「自然じゃない」ので、
2005_10_31 を格納したかったに違いないと。

>>966
なるほど、100で割ったあまりにすればいいわけか。
そうするです。
969root▲ ★
垢版 |
NGNG
IDを、じゃなくて、IDの種をか。
2005/10/31(月) 20:29:08ID:MAFKa8FN0
>966
後半、正解
NGNG
もすかすて、$GB->{MD5DATE} ってば、ID生成のためだけに使われているのならばそのまま放置しても良さそうな♪
2005/10/31(月) 21:44:31ID:FYOQZkFB0
気づいたときに自然な方法に修正しないと、バグが仕様化して後で痛い目を見る。

……と、厳密なのって日本人エンジニアとポーランド人数学者の特徴だよな。そのノリは好きだけど。
2005/10/31(月) 22:28:24ID:381okt4U0
>>971
後で何か日付が必要になった時に、
「あ、ここで取得してるじゃん、これ使っちゃえ」
ってのはよくある話。
NGNG
>>972
いへいへ、いつも私はそうしています(哀)@気が付いたらゴニョゴニョ

>>973
そういう発想がいちばん痛い目に遭うって気もしますですです(照)@そういうのからはもう足を洗いました♪

やっぱり一度は整理整頓してみたいよなぁ(苦笑)@bbs.cgi
2005/11/01(火) 01:53:58ID:RDlLoN8A0
あるスレッドの次スレという物が立ったらあるスレッドを速攻で足切りにできませんかねぇ?
スレを立てた人間によるスレストというか。
次スレが立った、じゃあ(無駄なレスで)埋めるって流れが嫌いなだけですけどね。
2005/11/01(火) 03:47:02ID:ZJKg5H9y0
次スレ立ての競争が無意味に苛烈になるだけなのでとても賛成できない。
めちゃめちゃなスレを立てておいて「次スレ」と主張し、現行スレを無理矢理
足切りに…なんて事をする輩が湧くのが目に見えているぞ。

「スレッドは1000ぎりぎりまで使い切ってから移行しましょう」という運動でも
立ち上げる方がまだ現実的だよ。
2005/11/01(火) 09:50:27ID:OIcg6Yo20
1000で自動次スレ立ては?
2005/11/01(火) 10:16:41ID:cAD241lE0
>>975>>977も、ちょっと考えればシステム的にどうやっても無理ってわかりそうなもんだけど。
自動的に正しい判断ができる拠り所がない。
個人がきっちり常に管理してる掲示版であれば可能かもしれんけど。

>>975
正式な次スレが立ったという判定はどうするん?
スレ立てた人って常駐してるわけじゃないし、そもそも立てる人って単に立てられる人なだけ場合も多々ある。
代行する人もいるんだし。
またその人が正しい判断をする人かどうかもわからん。

>>977
次スレが必要あるかどうかの判断は?
必要な場合だとしも、スレタイは?テンプレは?汎用的にやろうとすると無理。
2005/11/01(火) 12:41:21ID:FnB9EIr90
そもそもそんなシステムが必要な理由からしてわからないですよ。


2005/11/01(火) 14:30:49ID:rk1nvBlM0
そろそろスレ違いなんで、雑談スレへでもどうぞって感じ
2005/11/02(水) 02:28:21ID:U9irf3Pa0
>>980
すんません、投げるところを間違えたみたいですね。

とにかく、このスレッドみたいに980を超えた後、埋めるかとか言い出す奴とか
実際に埋めてしまう奴とかを撲滅できればいいんですよ。
終わり際に見苦しいというか。
2005/11/02(水) 08:37:09ID:7i0vAmj10
見苦しいのは同意。でも撲滅しなきゃいけないという使命感は要らないと思われ。

そーゆー使命感ばかりに凝り固まると、潔癖君になっちゃうぞ。
2005/11/02(水) 09:08:51ID:U9irf3Pa0
やや潔癖症がはいってるから気になるのだが。
2005/11/02(水) 09:23:44ID:1dG8QrWJP
程良い汚さが2chの魅力ですよ
2005/11/02(水) 16:03:05ID:AkEhFrGj0
で、ここもそろそろ次スレお願いします
2005/11/02(水) 16:18:18ID:GALgU8v20
>>981
わかってないね
975みたいな機能つけたら糞次スレ立てまくりスレストしまくりの
荒らしに利用されるのが目に見えてる
提案内容がお粗末過ぎるんだよ
2005/11/02(水) 16:38:45ID:o9pnyDkb0
新機能の要望ならこっちのはずだが

◆新機能をねだるスレ@運用情報◆ Part2
http://qb5.2ch.net/test/read.cgi/operate/1112024113/

関係ないスレでいろいろ喚くのも荒らしと変わらんよ
988root▲ ★
垢版 |
NGNG
友人の話では、Perl では /i の処理がめちゃんこ遅いという話があるらしい。

つまり、
if($ENV{'SERVER_NAME'} =~ /2ch\.net/i)

みたいなのも、ちりも積もれば山となる可能性ありと。
2005/11/02(水) 16:48:01ID:4sehsTr40
ほとんど /i は取ったつもりだけど・・・
2005/11/02(水) 16:48:34ID:j49UPKofP
iってまだあったっけ?
991root▲ ★
垢版 |
NGNG
>>989
多くはないみたいですが、いくつか散見されるようです。
(>>988 は実際のソースからのコピペ)
992root▲ ★
垢版 |
NGNG
気づいたところは、私のほうでも取っておくです。
今ざっと見直してみましたが、たぶん、もうそんなにないと思いますです。

で、次スレの予感か。
993root▲ ★
垢版 |
NGNG
次立ててくるです。
994root▲ ★
垢版 |
NGNG
bbs.cgi再開発プロジェクト7
http://qb5.2ch.net/test/read.cgi/operate/1130918407/
2005/11/02(水) 17:11:19ID:4sehsTr40
Pで書くならCを知っていた方がよい。
Cで書くならAを知っていたほうが良いってことで、

一行(1ステップ)は一行なんだけど
使うと払わなきゃならない料金が違うのよネ

1円のもあれば 100万円のもある
正規表現は1,000万くらいか、
2005/11/02(水) 17:18:09ID:olBNsUSy0
ふんふん
997root▲ ★
垢版 |
NGNG
>>995
そですね。

なんか、組み込み系をやってた人の発想っぽいですね。それ。
そうゆう人かしら。

1000万は(いつものように)誇大表現ですけど、
方向性はそのとおりかもです。

# 知能によって船を作ったり爆破したりするあのサブルーチン群と、
# トラックバック系のサブルーチン群を、
# そのうち別ファイルにするかも、かも。
998root▲ ★
垢版 |
NGNG
>>997 は、どっか(dsoとか?)で、
占有するメモリとかが節約できるかどうか試してみてから、判断しようかなと。
999root▲ ★
垢版 |
NGNG
トラックバック系については、ソースの可読性ですね。
どうせ全部で使うので、単純に可読性だけです。

ということで、そろそろ1000か。
2005/11/02(水) 17:26:50ID:4sehsTr40
ぬわわわ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況