Memo/Linux/curl

http://dexlab.net/pukiwiki/index.php?Memo%2FLinux%2Fcurl
 

curl(libcurl)


slabメモリ使用量が肥大しメモリ不足になる

curl(libcurl)で定期的にhttps://リクエストを発行するようなサーバでメモリ不足になる。
topでみても怪しげなプロセスは無い。
「slabtop」で見るとdentryが異常にメモリを使っている。

  • 環境
    • CentOS 6.x 64bit
  • 対策
    • slabキャッシュ解放
      1. sync; echo 2 > /proc/sys/vm/drop_caches
    • curl, nssの更新
      1. sudo yum update curl nss-softokn
    • curlを実行するスクリプトに追加。2択
      1. export NSS_SDB_USE_CACHE=yes
      2. # または
      3. export TMPDIR=/dev/shm
  • 対策前:
    1. # curl実行後 dentunusd が大きく増えている事を確認
    2. sar -v 1
    3. 105021秒 dentunusd   file-nr  inode-nr    pty-nr
    4. 105022秒     42860       768     27417        10
    5. 105023秒     42860       768     27417        10
    6. ...
    7.  
    8. strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
    9. % time     seconds  usecs/call     calls    errors syscall
    10. ------ ----------- ----------- --------- --------- ----------------
    11. 100.00    0.000056           0      4505      4503 access
    12. ------ ----------- ----------- --------- --------- ----------------
    13. 100.00    0.000056                  4505      4503 total
  • 対策後:
    1. export NSS_SDB_USE_CACHE=yes
    2. strace -fc -e trace=access curl -s 'https://www.google.com' > /dev/null
    3. % time     seconds  usecs/call     calls    errors syscall
    4. ------ ----------- ----------- --------- --------- ----------------
    5.   0.00    0.000000           0        23        21 access
    6. ------ ----------- ----------- --------- --------- ----------------
    7. 100.00    0.000000                    23        21 total

curlでSSLが失敗する場合

curlが参照している中間証明書(CA)が古い場合にも起きる。
php等でlibcurlを使っている場合も同様。

  • CentOS6.x
    1. mv /etc/pki/tls/certs/ca-bundle.crt /etc/pki/tls/certs/ca-bundle.crt.$(date +%Y%m%d)
    2. wget http://curl.haxx.se/ca/cacert.pem -O /etc/pki/tls/certs/ca-bundle.crt

curlオプション

  • プロキシ経由でアクセス
    1. curl -x proxy.example.com:8080 -L https://www.google.com
  • --retry-max-time <seconds> : リトライを指定時間以内に終わらせる。
  • --retry <num> : 再試行回数。--max-timeには影響されず、--retry-max-timeを指定する必要がある
  • -m/--max-time <seconds> : コマンド実行を指定時間以内に終わらせる。ただし、--retryには影響しない
  • --connect-timeout <seconds> : 接続するまでのタイムアウト。接続した後に時間がかかる場合には向かない
  • -w/--write-out <format> : 出力を加工
    1. # http status
    2. curl -LI -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1
    3. 200 #結果
    4.  
    5. # download spees (byte)
    6. curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1
    7. 242079.000
  • -s/--silent プログレスメータやエラーメッセージを表示しない
  • -S -sと併用するとエラーメッセージだけ表示する
  • -H/--header <line> : httpヘッダ等を付与できる
  • -T/--upload-file <file> : PUTメソッドでファイルを送信
  • -X POST 等のメソッドを指定。デフォルトはGET
  • -d "key=value" でデータを送信できる。-X POST -d "key1=value1" -d "key2=value2"
  • -o filename 出力をファイルに保存
  • -O アクセスしたファイルがindex.htmlなら同じ名前で保存
  • -i http headerも出力
  • -I http headerのみ表示。HEAD メソッドと同じ
  • -A ユーザエージェントを指定
  • -L リダイレクトされていても取得
  • --insecure SSL証明書を無視

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-24 (月) 17:43:17 (122d)