地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

tcpサーバでのLinux カーネルチューニング

メモ

# NIC に対する受信パケットの最大キューイング数
net.core.netdev_max_backlog = 16000

# TCPとUDPの受信バッファのデフォルトサイズと最大サイズ
net.core.rmem_max = 4194304

# TCPとUDPの送信バッファのデフォルトサイズと最大サイズ
net.core.wmem_max = 4194304

# データ受信バッファ サイズ
net.ipv4.tcp_rmem = 4096        87380   4194304

# FINのタイムアウト時間
net.ipv4.tcp_fin_timeout = 12

# tcpのSYNを送信するリトライ回数
net.ipv4.tcp_syn_retries = 2

# TCP/IPの送信時に使用するポートの範囲
net.ipv4.ip_local_port_range = 32768    60999

# 自分からの接続を使い回す
net.ipv4.tcp_tw_reuse = 1

# RFC1337に準拠させる
net.ipv4.tcp_rfc1337 = 1

# システムが同時に保持するtime-waitソケットの最大数
net.ipv4.tcp_max_tw_buckets = 360000

# 一度に受け入れられるTCPセッションのキューの数
net.core.somaxconn = 4096

# ソケット当たりのSYNを受け付けてACKを受け取っていない状態のコネクションの保持可能数
net.ipv4.tcp_max_syn_backlog = 16000

# 1ならsyncookies送信。0ならdrop
net.ipv4.tcp_syncookies = 1

# 
net.ipv4.tcp_abort_on_overflow = 0

## ファイルシステム関連

# ファイルシステムでのオープンファイルの上限
fs.file-max = 1619870

diffをいい感じにシンタックスハイライトする delta

github.com

gitおよびdiff出力用のビューア。diffにいい感じに色をつけてくれる便利ツールです。

インストール

macなら以下でインストール可能。他OSも丁寧にREADMEに書かれている

brew install git-delta

README.md

before

git diffのみ実行

f:id:ryuichi1208:20200725155015p:plain

after

git diff | deltaを実行

f:id:ryuichi1208:20200725155042p:plain

【Linux】プロセス番号の最大値 Linux カーネルパラメータ

システムプログラミングのテスト時に覚えた知識。

linuxはプロセスを一意にするためにpidという値を使用している。この値はデフォルトで32768となっているが軽量プロセスを大量生成したりプロセス数が最大値じにforkした後の動作を確認するときに使えるカーネルパラメータ

システム全体でのスレッド数の上限

システム全体でカーネルが一度に使用できるスレッドの最大数を定義する。

デフォルト値はちょっと複雑な計算をしている (mempages / (8 * THREAD_SIZE / PAGE SIZE ))

ただしこの値意外にもユーザごとにulimitsなんかも効いてくるので注意 (ulimit -uとかでユーザあたりのプロセス数を確認できる)

/proc/sys/kernel/threads-max

プロセス番号の最大値

64bitサーバなら最大値は4M程度まで伸ばせるらしい。デフォルトは32768

/proc/sys/kernel/pid_max

参考

7.5. システムメモリー容量の設定 Red Hat Enterprise Linux 7 | Red Hat Customer Portal

いい感じのvimが入ったdocker image

いい感じ = 私が使いやすいって意味でのDocker image

# syntax=docker/dockerfile:experimental

ARG ALPINE_OS_VERSION="3.8"

#### Builder ####
FROM alpine:${ALPINE_OS_VERSION} AS builder
LABEL maintainer="ryucrosskey@gmail.com"
WORKDIR /home/vim
RUN apk add --no-cache --virtual .dev \
        gcc \
    gfortran \
        libc-dev \
        make \
        gettext \
    mercurial \
    ncurses-dev \
    && apk add --no-cache \
        git \
    lua lua-dev luajit-dev\
    python-dev \
    python3-dev \
    ruby ruby-dev \
    perl-dev \
    && git clone https://github.com/vim/vim.git \
    && cd vim \
    && ./configure \
        --enable-gui=gtk3 \
        --enable-perlinterp \
        --enable-pythoninterp \
        --enable-python3interp \
        --enable-rubyinterp \
        --enable-luainterp --with-luajit \
        --enable-fail-if-missing \
    && make \
    && make install


#### vim container ####
FROM alpine:${ALPINE_OS_VERSION}
ENV VIM_USER vim
ENV VIM_GROUP vim
ENV VIM_SHELL /bin/sh
ENV HOME /home/${VIM_USER}

WORKDIR ${HOME}

RUN addgroup -S ${VIM_GROUP} \
    && adduser -S ${VIM_USER} -G ${VIM_GROUP} \
    && echo "${VIM_USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers \
    && echo 'vim:vim' | chpasswd \
    && apk update \
    && apk add --no-cache --virtual .dev \
    curl=7.61.1-r3\
        git=2.18.1-r0 \
    lua-dev \
    luajit-dev\
    python-dev \
    python3-dev \
    ruby \
    ruby-dev \
    perl-dev \
    npm=8.14.0-r0 \
    yarn=1.7.0-r0 \
    zsh=5.5.1-r0 \
    && mkdir -p ${HOME}/.cache/dein ${HOME}/.vim \
    && curl https://raw.githubusercontent.com/Shougo/dein.vim/master/bin/installer.sh > installer.sh \
    && sh ./installer.sh /home/vim/.cache/dein \
    && git clone https://github.com/zplug/zplug ${HOME}/.zplug \
    && pip3 install -U pip==19.3.1 \
    && pip3 install jedi==0.15.1 \
    && chown -R ${VIM_USER}:${VIM_GROUP} ${HOME}

USER ${VIM_USER}:${VIM_GROUP}

COPY --from=builder /usr/local/ /usr/local/
COPY --chown=${VIM_USER}:${VIM_GROUP} config/vimrc ${HOME}/.vimrc
COPY --chown=${VIM_USER}:${VIM_GROUP} config/zshrc ${HOME}/.zshrc
COPY --chown=${VIM_USER}:${VIM_GROUP} config/dein.toml ${HOME}/.vim/dein.toml

SHELL ["/bin/sh"]
ENTRYPOINT ["/bin/zsh"]

jediやらcocやらのセットアップまでをdocker buildでやってしまう感じ。

vimrcのCIなんかでも使えそうだなと思いつつも導入はしていない。

github.com

久々にjediを使ってみたけどpythonだけ書くならcocまで導入せずともjediだけで良さげな気がした。