Memo/Linux/curl

https://dexlab.net:443/pukiwiki/index.php?Memo/Linux/curl
 

curl(libcurl)


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

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

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

curlでSSLが失敗する場合

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

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

curlオプション

  • プロキシ経由でアクセス
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> : 出力を加工
# http status
curl -LI -s -w "%{http_code}" "http://www.google.co.jp" -o /dev/null 2>&1
200 #結果
# download spees (byte)
curl -s -w "%{speed_download}" "http://www.google.co.jp" -o /dev/null 2>&1
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: 2018-09-15 (土) 07:31:38 (9d)