Linux memo 2019/11/22

● lz4の弱点
2016年のOSS圧縮ツール選択カタログ
https://qiita.com/nishemon/items/818cc64dc2f8577edd87
非常によく書かれた上記記事で「もはやこの分野のデファクトスタンダード」(この==速度特化型)と言わしめたlz4にも弱点があった。
lz4はデータ破損に弱く、またチェックサム類を持たないので、入力データがおかしい場合に気づきにくい。いや入力データが壊れてるとかそっちが問題だろ、というのはその通りだけど、問題とは発見されるまでは問題ではないわけで、えっとその...

● bind()のEADDRINUSEエラー
TCPサーバでbind()やlisten()がEADDRINUSEを返す場合はSO_REUSEADDRを指定できていない、というのはFAQ的だけど、これは実はサーバじゃなくても起こる。
TCPソケットにおけるTIME_WAITとSO_REUSEADDRの関係 - Qiita
https://qiita.com/bamchoh/items/1dd44ba1fbef43b5284b
短命ポートの問題は10年に一度やってくる - IGINブルネイ/syasudaの日記(MT版)
http://syasuda.com/d/blog/2019/04/10-3.html
クライアントはエフェメラルポートを使うのが通常なので踏むことが少ないけど、クライアントでポートを固定した場合に踏む。
逆に、エフェメララルポートとして使われたものもTIME_WAITになり、TIME_WAITのままサーバとしてbind(),listen()しようとするとEADDRINUSEを踏む。クライアントはSO_REUSEADDRを指定しても意味がない。素直にサーバで使うポートはip_local_reserved_portsで除外するのが正解かと。
(...と書いたもののkernelコードからの裏付けやら実テストやらがまだできてない...)
 ※ → 2019/12/22追記:実際に動かしてみて確認済み。
過去の記事(TIME_WAIT関連のメモ)もドゾ。

● TCPポートの補足
/proc/sys/net/ipv4/ip_local_port_rangeやip_local_reserved_portsは、名前に似合わずIPv6のTCPも使う。inet_csk_get_port()を使っているから。
このへんはip(7)(procfsのip_local_reserved_portsの説明)にも書かれていないっぽい?
ToDo: ipv4とipv6でTCPポートは別々に処理できる?(ポートの数を実質増やせる?)
→2019/11/27追記、Yes、ただし正確には「IPアドレスごとに処理できる」で、IPv4だけでもIPアドレスが異なれば良い。とはいえNAT環境でプライベートIPアドレス増えてもだと実質意味がないので、グローバルIPアドレスが必要かな。

● fd数上限
プロセス毎の上限は/proc/self/limitのMax open files、kernel的にはNR_FILEの8192かな?
全体の上限は/proc/sys/fs/file-max (R/W) と file-nr (R)、kernel的にはulongの最大値までいけそう?

● gccに-O2をつけ忘れないこと
gccに-O2をつけ忘れないこと。がんばって最適化したつもりでも-O2がついていないとすべてが台無しになる。...オレのがんばりをドブに捨ててたアンタのことだよ...

このブログ記事について

このページは、らるるが2019年11月22日 22:53に書いたブログ記事です。

ひとつ前のブログ記事は「errno, signal, mmc's cmd, csd, ext_csd」です。

次のブログ記事は「Linux memo 2019/12/04」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0