34

AWS EC2 ラージ インスタンスに 20MB 未満の pdf ファイル (各 pdf は広告を表します) のディレクトリがあります。RubyとDM-Paperclipを使用して、各pdfファイルをS3にアップロードしようとしています。

ほとんどのファイルは正常にアップロードされますが、一部のファイルは CPU が 100% でハングアップして数時間かかるようです。関連するセクションにデバッグ ステートメントを出力することで、問題の原因となっているコード行を特定しました。

 # Takes an array of pdf file paths and uploads each to S3 using dm-paperclip
 def save_pdfs(pdfs_files)
  pdf_files.each do |path|
  pdf = File.open(path)
  ad = Ad.new
  ad.pdf.assign(pdf) # <= Last debug statment is printed before this line
  begin
    ad.save
  rescue => e
    # log error
  ensure
    pdf.close
  end
 end

問題のトラブルシューティングを支援するために、プロセスが 100% でスタックしている間に strace をプロセスにアタッチしました。その結果、次のような数十万行になりました。

 ...
 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3543, ...}) = 0
 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3543, ...}) = 0
 stat("/etc/localtime", {st_mode=S_IFREG|0644, st_size=3543, ...}) = 0
 ... 500K lines

数千人が続く:

 ...
 brk(0x1224d0000)                        = 0x1224d0000
 brk(0x1224f3000)                        = 0x1224f3000
 brk(0x122514000)                        = 0x122514000
 ...

ハングしないアップロード中、strace は次のようになります。

 ...
 ppoll([{fd=12, events=POLLOUT}], 1, NULL, NULL, 8) = 1 ([{fd=12, revents=POLLOUT}])
 fstat(12, {st_mode=S_IFSOCK|0777, st_size=0, ...}) = 0
 fcntl(12, F_GETFL)                      = 0x2 (flags O_RDWR)
 write(12, "%PDF-1.3\n%\342\343\317\323\n8 0 obj\n<</Filter"..., 4096) = 4096
 ppoll([{fd=12, events=POLLOUT}], 1, NULL, NULL, 8) = 1 ([{fd=12, revents=POLLOUT}])
 write(12, "S\34\367\23~\277u\272,h\204_\35\215\35\341\347\324\310\307u\370#\364\315\t~^\352\272\26\374"..., 4096) = 4096
 ppoll([{fd=12, events=POLLOUT}], 1, NULL, NULL, 8) = 1 ([{fd=12, revents=POLLOUT}])
 write(12, "\216%\267\2454`\350\177\4\36\315\211\7B\217g\33\217!e\347\207\256\264\245vy\377\304\256\307\375"..., 4096) = 4096
 ...

この問題の原因となる PDF ファイルはランダムに見えます。これらはすべて有効な pdf ファイルであり、サイズも比較的小さいものです。それらは ~100KB から ~50MB の間で異なります。

一見過剰な stat システム コールを伴う strace は、私の問題に関連していますか?

4

0 に答える 0