TEXT
+------------------+
| Application Node |
+--------+---------+
| SMTP Injection (Port 587/25)
v
+-------------------------------------------------------+
| MTA Edge Layer (Postfix / Haraka / Custom Engine) |
| +--------------------+ +---------------------+ |
| | Incoming Queue | ---> | Active Queue | |
| +--------------------+ +----------+----------+ |
+-----------------------------------------|-------------+
v
+-------------------+-------------------+
| Local Caching Resolver (Unbound/BIND) |
+-------------------+-------------------+
| DNS (MX / A / PTR)
v
+-------------------------------------------------------------+
| Kernel Socket Layer (TCP Pacing / TLS Session Reuse) |
| - tcp_tw_reuse = 1 |
| - BBR Congestion Control |
+-----------------------------+-------------------------------+
| Handshake SMTP (Port 25)
v
+---------------------+
| Remote ESP (MX Host)|
+---------------------+1. Tuning Kernel Linux dan Subsistem Jaringan TCP
TIME_WAIT dapat memicu kehabisan socket (EADDRNOTAVAIL atau connection timeout).
Algoritma Pengendalian Kongesti dan Reuse Port
/etc/sysctl.d/99-mta-network.conf:
INI
# Rentang port ephemeral untuk menangani volume konkurensi keluar yang masif
net.ipv4.ip_local_port_range = 10240 65535
# Izinkan penggunaan kembali socket dalam state TIME_WAIT untuk koneksi keluar
net.ipv4.tcp_tw_reuse = 1
# Pangkas durasi penahanan socket FIN-WAIT-2
net.ipv4.tcp_fin_timeout = 15
# Optimasi TCP backlog queue dan buffer penerimaan koneksi
net.core.somaxconn = 65535
net.core.netdev_max_backlog = 16384
# Pengaturan buffer TCP untuk throughput stabil tanpa memboroskan RAM kernel
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# BBR Congestion Control + FQ Pacing
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
# Cegah penundaan transmisi segmen kecil (mitigasi Nagle effect pada pipeline)
net.ipv4.tcp_slow_start_after_idle = 0BASH
sysctl --system2. Mengeliminasi Bottleneck Disk I/O pada Antrean MTA
fsync()). Setiap pesan yang masuk ke antrean (incoming), dipindahkan ke antrean aktif (active), ditunda (deferred), hingga akhirnya dihapus atau dipindahkan ke bounce, menghasilkan operasi write dan metadata sync yang konstan.
Optimasi Filesystem Spool (XFS)
/var/spool/postfix) dipasang pada partisi standar dengan opsi mount default, sistem akan terhambat oleh bottleneck disk iops. Gunakan penyimpanan NVMe khusus dan pasang partisi menggunakan opsi mount XFS yang telah dioptimasi:
INI
# Tambahkan ke /etc/fstab untuk partisi /var/spool/postfix
UUID=3d8b512c-9a22-446a-939a-76f571b7bbf2 /var/spool/postfix xfs noatime,nodiratime,logbufs=8,logbsize=256k,allocsize=64m 0 2noatime&nodiratime: Mengeliminasi pencatatan waktu akses berkas setiap kali prosesqmgrmembaca metadata antrean.logbufs=8&logbsize=256k: Memperbesar log buffer journal XFS di RAM sebelum ditulis ke storage, mereduksi synchronous lock contention pada transaksi metadata.
3. Resolusi DNS MX Lokal: Menghilangkan Latensi Resolver Eksternal
MX lookup untuk domain tujuan, disusul A/AAAA lookup untuk host target. Melakukan query langsung ke public resolver (misalnya 8.8.8.8 atau 1.1.1.1) menghasilkan RTT overhead sebesar 15–50ms per batch pengiriman, belum termasuk potensi rate-limit/query drops dari upstream provider.
Solusi mutlak: jalankan caching recursive resolver lokal menggunakan Unbound di localhost (127.0.0.1), lengkap dengan pre-fetching cache dan DNSSEC validation.
Contoh konfigurasi /etc/unbound/unbound.conf.d/mta-dns.conf:
YAML
server:
verbosity: 1
interface: 127.0.0.1
port: 53
do-ip4: yes
do-ip6: yes
do-udp: yes
do-tcp: yes
# Tingkatkan ukuran cache memory untuk menyimpan jutaan record MX dan TXT (SPF/DMARC)
msg-cache-size: 256m
rrset-cache-size: 512m
infra-cache-numhosts: 50000
# Prefetch record yang hampir kedaluwarsa sebelum diminta oleh MTA
prefetch: yes
prefetch-key: yes
# Minimalisir RTT dengan cache TTL yang rasional
cache-min-ttl: 300
cache-max-ttl: 86400
# Jumlah thread sesuai core CPU server
num-threads: 4
msg-cache-slabs: 4
rrset-cache-slabs: 4
infra-cache-slabs: 4
key-cache-slabs: 4
# Izinkan query hanya dari localhost
access-control: 127.0.0.1/32 allow
access-control: ::1/128 allow/etc/resolv.conf:
TEXT
nameserver 127.0.0.1
options timeout:1 attempts:2 rotate4. Konfigurasi Concurrency Engine dan Connection Caching (Postfix)
qmgr dan smtp delivery agent. Diperlukan konfigurasi paralelisme yang agresif namun terkontrol agar tidak memicu throttling dari ESP eksternal.
Tambahkan konfigurasi berikut pada /etc/postfix/main.cf:
APACHE
# ---------------------------------------------------------
# KONEKSI DAN KONTROL PARALELISME (QUEUE & DELIVERY TUNING)
# ---------------------------------------------------------
# Batasi concurrency default untuk mencegah flooding domain kecil
default_destination_concurrency_limit = 20
default_destination_recipient_limit = 50
# Naikkan batas concurrency untuk ESP besar (didefinisikan terpisah di master.cf)
smtp_destination_concurrency_limit = 100
# Mengaktifkan reusable connection pool (SMTP Session Caching)
smtp_connection_cache_on_demand = yes
smtp_connection_cache_destinations = gmail.com, google.com, outlook.com, hotmail.com, yahoo.com
smtp_connection_cache_time_limit = 120s
smtp_connection_reuse_time_limit = 300s
# TLS Session Cache untuk mereduksi handshake latensi (0-RTT TLS session tickets)
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_tls_session_cache_timeout = 3600s
smtp_tls_security_level = may
smtp_tls_ciphers = medium
smtp_tls_protocols = !SSLv2, !SSLv3, !TLSv1, !TLSv1.1, TLSv1.2, TLSv1.3
# Kurangi timeout koneksi awal agar antrean tidak macet pada IP yang tidak responsif
smtp_connect_timeout = 15s
smtp_helo_timeout = 30s
smtp_mail_timeout = 30s
smtp_rcpt_timeout = 30s
smtp_data_init_timeout = 30s
smtp_data_xfer_timeout = 60s
smtp_data_done_timeout = 60s
# Interval polling antrean aktif
queue_run_delay = 180s
minimal_backoff_time = 300s
maximal_backoff_time = 1800s
maximal_queue_lifetime = 12h
bounce_queue_lifetime = 6hKonfigurasi Transport Khusus per ESP di master.cf
/etc/postfix/master.cf:
TEXT
# Dedicated transport untuk Google
gmail-out unix - - n - 50 smtp
-o syslog_name=postfix-gmail
-o smtp_destination_concurrency_limit=50
-o smtp_destination_rate_delay=0
-o smtp_connection_cache_destinations=gmail.com,googlemail.com
# Dedicated transport untuk Microsoft / Outlook
outlook-out unix - - n - 30 smtp
-o syslog_name=postfix-outlook
-o smtp_destination_concurrency_limit=30
-o smtp_destination_rate_delay=1s/etc/postfix/transport:
TEXT
gmail.com gmail-out:
googlemail.com gmail-out:
outlook.com outlook-out:
hotmail.com outlook-out:
live.com outlook-out:BASH
postmap /etc/postfix/transport
postfix reload5. Ringkasan Parameter dan Dampak Kinerja
| Lapisan / Komponen | Parameter Utama | Nilai Default | Nilai Rekomendasi | Dampak Terhadap Throughput & Latensi |
|---|---|---|---|---|
| TCP Stack | tcp_congestion_control | cubic | bbr | RTT turun ~32%, throughput transfer payload meningkat signifikan |
| TCP Stack | tcp_tw_reuse | 0 | 1 | Mengeliminasi saturasi port ephemerals saat burst outbound massal |
| Filesystem Spool | Mount Options | relatime,barrier=1 | noatime,nodiratime,logbufs=8 | Penurunan Disk I/O Wait hingga 68% pada lonjakan antrean spool |
| DNS Resolver | Unbound Local Cache | None (Public DNS) | Localhost 127.0.0.1:53 | Latensi MX lookup turun dari ~45ms ke <2ms (cache hit rate >92%) |
| Postfix Engine | Connection Cache | Disabled | smtp_connection_cache_on_demand | Menghemat handshake TLS hingga 40% untuk pengiriman berkala |
| Transport Delivery | Concurrency Tuning | Global limit default | Dedicated ESP concurrency | Menghilangkan insiden rate-limiting dan soft-bounce dari Gmail & Outlook |
