ログインシェルの ulimit -n を信じる前に、稼働中のデーモンを調べます。squid.service を使うインストールでは、まず次を実行します。

systemctl show squid.service -p MainPID -p LimitNOFILE
systemctl cat squid.service

実際のプロセス ID を使って /proc/PID/limits を読みます。マルチプロセス構成では、該当するワーカーも確認します。設定ファイルに保存された値は、このプロセスがそれを継承した証拠にはなりません。

制御範囲
シェル ulimit と PAM limits.confシェルの子孫、または PAM 設定を実際に使うセッション
systemd LimitNOFILE=そのサービスのリソースポリシー下で起動されたプロセス
Squid max_filedescriptors(対応している場合)オペレーティングシステムの制約内でのアプリケーション上限

管理者がファイルを変更したというだけで、システムサービスが PAM の編集を取り込むわけではありません。systemd の上限を変えるのが適切な場合は、サービス固有の drop-in を使います。Squid の文書によれば、max_filedescriptors の変更には再起動が必要です。未設定のままにすると OS のソフト上限を継承します。

上限はユーザー数ではなくディスクリプタ数で見積もります。クライアントは複数のソケットを保持でき、外向き接続、ログ、ヘルパーパイプもディスクリプタを消費します。上限を上げれば、起こりうるディスクリプタごとに固定の RAM を即座に確保することなく、より多くの消費を許せます。ソケットあたりの古いメモリ見積もりも 65,535 も、万能の容量要件でも Linux の天井でもありません。

サービス変更後は、新しいプロセスの上限を意図した値と比較します。そのはるか下で障害が起きるなら、実際に枯渇しているリソースを調べます。

関連記事