net-nyan-cat

俺たちがインフラ野郎Aチーム

Python ソケットプログラミングについての備忘

ソケットプログラミングは難しい…。 自分でいろいろコードを書いてて思ったので疑問とか書いておく。
TCP/IPに繋がる大事な部分だからちゃんと調べないといけないよね。
書いたコードは以下。

github.com

pythonにおけるソケットプログラミングでは、

  • socketを作る
    sock = socket.sockeet(socket.AF_INET, socket.SOCK_STREAM)
  • socketをアドレスにbindする
    sock.bind(listen_ip, listen_port)
  • bindされたsocketをlisten状態にする
    sock.listen()
  • socketへの接続を許可(accept)する
    con, addr = sock.accept()

で、conに対してデータをやり取りする、ってのが一般な流れ。
ただ、sock.accept()に関してはちょっと難しい部分が多いように感じる。
python3の公式ドキュメントには、

socket.accept()

接続を受け付けます。
ソケットはアドレスにbind済みで、listen中である必要があります。
戻り値は(conn, address) のペアで、 conn は接続を通じてデータの送受信を行うための 新しい ソケットオブジェクト、 address は接続先でソケットにbindしているアドレスを示します。

accept()で実際にどのような動作をするのか詳しく調べられていない。
受け付けるタイミングっていうのは、いったいいつなんだろう。
LISTENしているポートに接続があった瞬間にaccept()を叩くことで、それが許可されるのか、 それともLISTENしているポートにaccept()を叩いておくことで、接続が許可されるのかわからない。

低水準ネットワークインターフェイスと呼ばれるように、ソケット周りに関してはOS周りのソケットAPIを 呼び出すため、もっとLinuxの知識を深める必要がありそう。

vmstatでhuman-readableな表記をする

最近Linuxサーバのパフォーマンスチューニングに熱中しています。
難しいし、やりすぎるとサーバが動かなくなるこの感覚、
ミニ四駆であったシャーシの肉抜きみたいなところありますね。(?)

パフォーマンスの確認、ということで vmstat でサクッとサーバの状態をチェックすることがあるんですが、 memory欄のfree欄、これ標準がキロバイト表記なので最近のクラウドでRAM16GBインスタンス!とかではめちゃ見ずらくなります。

f:id:xrzhev:20200611133748p:plain
4GBですらこれ。 訓練が足りなくて400メガとかに見間違えそうだ…

これをメガバイト表記にするオプションはこちら。

vmstat -S m

f:id:xrzhev:20200611134124p:plain
ちゃんとメガ表記になったね

ただし、vmstatのヘッダではメガバイト表記に直しているとは表示されないので、
見間違えないように…。

Webアプリを作っている①

先日、Webアプリを作ろう…とかうけうけと抜かしてしまったのでちゃんと作ることにした。
いーやマジで複雑になるとプログラムって意味わかんなくなるね。
今は全然複雑じゃないんだけども。 クソコードって自分でもわかるわ…。

f:id:xrzhev:20200602143149p:plain

続きを読む

WEBアプリを作ろう…というメモ

インフラ業を生業としてると大量のドメインSSL証明書を管理することが多々あるんですよね。

ドメインの更新を忘れるとドメインが使えなくなり、サイトにアクセスできなくなる状態が長時間続いたり、SSL証明書期限切れでアプリケーションが動作不能、なんてことも…。

「些細なことだろ、Excelにまとめて毎日チェックしろ」といわれればそうだけど、
エンジニアなのでそれを自動化するアプリを地道に作ろかと思います。

続きを読む

Nginxのキャッシュについて(fastcgi_cache, proxy_cache)

Nginxのキャッシュは2つの種類があり、それぞれで動作が異なるんですよね。
たまーに設定しようとすると特性を忘れる傾向にあるのでメモ程度に。

続きを読む