2012-04-15 13 views
0
func init() { 
    http.HandleFunc("/", handler) 
} 

ハンドラ関数では、データのリストを繰り返し処理し、結果を集計するコードがあります。AppEngineの部分実行を繰り返してhttp.handlerを実行します

特定のクエリに対して、処理する必要のあるアイテムが100個あるとします。各アイテムについて、Appengineコンソールへのログを書き込みます。「アイテムnは処理されました」。

ここに問題があります。

リクエストは返されません。最初の40個程度の項目のログメッセージを繰り返し、繰り返して繰り返します。それは常に同じアイテムであり、再開します。

Appengine Goランタイムは、アプリケーションがメモリの制限などにぶつかっていることを推測しています.Appengine Goランタイムは、単に再起動してハンドラを再実行しています。

小さなリストの項目については、処理は期待通りに行われ、ログにはループが表示されません。

は、要求ログには、エラーはありませんが、別のログが表示さ:たぶん

panic: poll_ctl 

goroutine 3 [running]: 
runtime/eventloop.(*pollServer).ctlfd(0x9035f8, 0x204100000005, 0x3, 0x2041, 0x0, ...) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:428 +0xdf 
runtime/eventloop.(*pollServer).loop(0x9035f8, 0x0) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:411 +0x4d8 
created by runtime/eventloop.init·1 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:232 +0x40 

goroutine 1 [select (no cases)]: 
appengine_internal/fd_transport.serveHTTP(0x7fff76502f58, 0x70615f2f00000002, 0x7fff76502f5b, 0x3, 0x7fff76502f6c, ...) 
    go/src/pkg/appengine_internal/fd_transport/fd_transport.go:44 +0x26b 
appengine_internal.Main() 
    go/src/pkg/appengine_internal/internal.go:184 +0x1a8 
main.main() 
    _go_main.go:16 +0x18 

goroutine 2 [select]: 
created by _ 
    _.go:568 +0xd2 

goroutine 10 [chan receive]: 
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095a60, 0xf84011ac30, 0xb, 0x1, ...) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7 
runtime/eventloop.(*FD).ReadFrom(0xf840095a50, 0xf840138000, 0x7d0000007d0, 0xf800000000, 0x0, ...) 
    go/src/pkg/runtime/eventloop/fd.go:135 +0x1c2 
created by _ 
    _.go:144 +0x7a 

goroutine 5 [chan receive]: 
created by _ 
    _.go:461 +0x3ca 

goroutine 6 [semacquire]: 
sync.runtime_Semacquire(0xf8408034d8, 0xf8408034d8) 
    go/src/pkg/runtime/zsema_amd64.c:146 +0x25 
sync.(*Cond).Wait(0xf840096bb0, 0x1) 
    go/src/pkg/sync/cond.go:67 +0xaa 
created by _ 
    _.go:462 +0x3e1 

goroutine 7 [chan receive]: 
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095c70, 0xf84011ac30, 0xb, 0x1, ...) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7 
runtime/eventloop.(*FD).Read(0xf840095c60, 0xf84113a000, 0x972a80000000c, 0x2b5800000000, 0xf84011ac30, ...) 
    go/src/pkg/runtime/eventloop/fd.go:93 +0x18c 
io.ReadAtLeast(0xf84012c0c0, 0xf840095c60, 0xf84113a000, 0x972a80000000c, 0x2b580000000c, ...) 
    go/src/pkg/io/io.go:254 +0xc3 
io.ReadFull(0xf84012c0c0, 0xf840095c60, 0xf84113a000, 0x972a80000000c, 0xf840095c60, ...) 
    go/src/pkg/io/io.go:273 +0x69 
created by _ 
    _.go:845 +0x2c6 

goroutine 11 [runnable]: 
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf840095b10, 0xf84011ac30, 0xb, 0x1, ...) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7 
runtime/eventloop.(*FD).Accept(0xf840095b00, 0x0, 0x0, 0xf84011ac30, 0xb, ...) 
    go/src/pkg/runtime/eventloop/fd.go:72 +0x185 
net/http.(*Server).Serve(0xf840129f00, 0xf8400cfa80, 0xf840095b00, 0x0, 0x0, ...) 
    go/src/pkg/net/http/server.go:1012 +0x88 
net/http.Serve(0xf8400cfa80, 0xf840095b00, 0xf84012c090, 0xf8400e0b10, 0xf8400e0b10, ...) 
    go/src/pkg/net/http/server.go:977 +0x71 
created by _ 
    _.go:145 +0xe9 

goroutine 12 [timer goroutine (idle)]: 
created by addtimer 
    go/src/pkg/runtime/ztime_amd64.c:70 

goroutine 13 [runnable]: 
runtime/eventloop.(*pollServer).wait(0x9035f8, 0xf8400959b0, 0xf84011ac30, 0xb, 0x1, ...) 
    go/src/pkg/runtime/eventloop/poll_linux_amd64.go:472 +0x1a7 
runtime/eventloop.(*FD).Read(0xf8400959a0, 0xf840139000, 0x100000001000, 0x0, 0xf84011ac30, ...) 
    go/src/pkg/runtime/eventloop/fd.go:93 +0x18c 
io.(*LimitedReader).Read(0xf84, 0xf840139000, 0x100000001000, 0xf8900000000, 0x0, ...) 
    go/src/pkg/io/io.go:394 +0xc1 
bufio.(*Reader).fill(0xf840129f80, 0x2b5853e92000) 
    go/src/pkg/bufio/bufio.go:77 +0xf0 
bufio.(*Reader).Read(0xf840129f80, 0xf84013d000, 0x27100000000c, 0xc, 0x0, ...) 
    go/src/pkg/bufio/bufio.go:142 +0x188 
io.ReadAtLeast(0xf84012c600, 0xf84012c570, 0xf84013d000, 0x27100000000c, 0xc, ...) 
    go/src/pkg/io/io.go:254 +0xc3 
io.ReadFull(0xf84012c600, 0xf84012c570, 0xf84013d000, 0x27100000000c, 0xf84012c570, ...) 
    go/src/pkg/io/io.go:273 +0x69 
net/http.(*conn).serve(0xf8401320c0, 0x0) 
    go/src/pkg/net/http/server.go:656 +0x621 
created by net/http.(*Server).Serve 
    go/src/pkg/net/http/server.go:1040 +0x430 

goroutine 59 [sleep]: 
time.Sleep(0x5dfdee1, 0xf8408034d0) 
    go/src/pkg/runtime/ztime_amd64.c:22 +0x49 
created by _ 
    _.go:791 +0xc4 

goroutine 15 [chan receive]: 

私はすべてのエラーをロギングないんだけど、でもあれば、どのようなループ引き起こす可能性が?

更新 ニアエンドレスループはすぐに、今、私がログに記録されていない引用符のエラーを、取得しています、私のデータストアの書き込みクォータを排出しました。エラーログの後、ハンドラが再度呼び出されます。そして再び....期待どおりにコードが実行F4インスタンスに切り替えた後

func handleError(w http.ResponseWriter, c appengine.Context, err error) { 
    c.Infof("ERROR") 
    c.Errorf("ERROR datastore: %s", err.Error()) 
} 


... 
rk, err := datastore.Put(c, rk, e) 
if err != nil { 
    handleError(w, c, err) 
    return 
} 

UPDATE 2 。私はまだAppengine Goの実行時間が何らかの理由で(メモリ)黙って失敗していると思って、ハンドラの実行を再開します。それは私の最高の推測です、私は分かりません。

+0

ハンドラのGoコードが効率的でない場合があります。あなたがそのコードを投稿した場合、おそらくそれを速く、よりメモリ効率の良いものにすることができる真剣なGoのエキスパートがたくさんいます。 –

+0

管理コンソールから完全なリクエストログを貼り付けることはできますか? – proppy

答えて

1

http要求に対して30秒のタイムアウトがあります。あなたがより速いインスタンスに移るずっと前にプロセスがそれを取っていましたか?バックエンドプロセスを使用して長寿命の処理を行うことができます。 https://developers.google.com/appengine/docs/go/backends/overview

+0

ありがとうございます、私は、要求がタスクキューから行われたことを述べたはずです。したがって、30秒のタイムアウトは適用されません。 –

関連する問題