Ollama di Intel Celeron, Bagian IV: Pengujian Kinerja Tailscale, LAN, dan Optimalisasi Chatbot

ollama tailscale benchmark grav-cms php telemetry

Pengujian Kinerja Ollama Melalui Tailscale & LAN: Mengejar Latensi di Bawah Detik untuk Chatbot Grav AI

Di Bagian III, kami membangun pipeline 5 tingkat untuk grav-ai-chatbot โ€” mesin pencari AI lokal yang berjalan di laptop Intel Celeron 6-Watt.

Begitu chatbot itu mulai menerima lalu lintas nyata dari perangkat-perangkat di jaringan berbeda โ€” LAN lokal dan jaring VPN Tailscale untuk akses dari luar rumah โ€” satu pertanyaan langsung muncul: apakah jalur jaringannya sendiri menambah latensi, di atas semua yang sudah kami perbaiki?

Jawaban singkatnya: hampir tidak. Tapi membuktikannya butuh telemetri asli, skrip benchmark khusus, dan beberapa pelajaran soal failover serta caching di sepanjang jalan. Ini dia hasilnya.


Dua Jalur, Satu Laptop

Ada anggapan umum bahwa semua trafik lewat Tailscale pasti singgah dulu di server relay di internet, sehingga menambah latensi. Itu memang benar โ€” tapi hanya kalau dua perangkat tidak bisa saling terhubung langsung. Kalau kedua perangkat berada di jaringan lokal yang sama, ceritanya beda.

Yang menentukan cepat-lambatnya koneksi sebenarnya bukan Tailscale itu sendiri โ€” overhead protokolnya sangat kecil, di mana pun posisi kedua perangkat. Ada dua faktor yang lebih menentukan:

  1. Bisa atau tidaknya kedua perangkat membentuk jalur peer-to-peer langsung. Ini sebagian besar tergantung jenis NAT masing-masing perangkat โ€” beberapa jenis NAT memudahkan hole-punching langsung, sebagian lain memaksa trafik lewat relay.
  2. Kualitas jaringan yang dilalui โ€” entah itu Wi-Fi rumah, routing dari ISP, atau internet publik kalau perangkatnya tidak berada di lokasi yang sama.

Dua perangkat di LAN yang sama menghilangkan kedua faktor itu sepenuhnya. Itu sebabnya angka-angka di bawah terlihat sebagus itu:

  1. Negosiasi peer-to-peer langsung. Tailscale mendeteksi bahwa kedua perangkat berbagi subnet lokal, lalu langsung menegosiasikan koneksi UDP terenkripsi lewat rentang IP virtualnya sendiri โ€” tanpa server relay sama sekali.
  2. Ping di bawah semili detik. Memanggil endpoint versi API Ollama, responsnya di bawah 0,1 milidetik โ€” baik lewat alamat LAN fisik maupun alamat Tailscale. Dalam praktiknya, ini jalur yang sama, cuma beda label nama.
Client / Server Web Grav
       โ”‚
       โ”œโ”€โ”€โ”€โ”€โ–บ Primer: Alamat mesh Tailscale   (~0.09 ms)
       โ”‚
       โ””โ”€โ”€โ”€โ”€โ–บ Cadangan: Alamat LAN Fisik     (~0.09 ms)

(Angka 100.x.x.x untuk antarmuka Tailscale dan 192.168.x.x untuk LAN di atas cuma ilustrasi โ€” alamat sebenarnya tentu spesifik untuk jaringan masing-masing.)

Karena kedua jalur sama-sama cepat, kami tetap membangun failover dua endpoint otomatis di OpenAiCompatibleClient.php. Jadi kalau alamat utama tidak merespons dalam 3 detik โ€” misalnya perangkat baru saja bangun dari tidur dan antarmuka jaringannya butuh waktu sejenak untuk rebind โ€” klien diam-diam mencoba alamat cadangan sebelum pengunjung sempat menyadari ada yang lambat.


Pengujian Kinerja: Tiga Ukuran Prompt di Dunia Nyata

Menggunakan telemetri yang ditarik langsung dari log server Ollama, kami menguji tiga skenario prompt โ€” pertanyaan singkat, permintaan ringkasan sedang, dan kueri konteks RAG yang panjang. Masing-masing diuji dua kali: sekali tanpa cache, sekali dengan prompt cache yang sudah hangat.

Prompt Singkat (38 token)

Metrik Tanpa Cache Dengan Cache Perubahan
Waktu evaluasi prompt 2.020,80 ms 205,40 ms ๐Ÿš€ 89,8% lebih cepat
Kecepatan generasi 5,57 token/detik 5,62 token/detik ~tetap
Latensi total 13,04 s 6,74 s 48,3% lebih cepat (hemat 6,3 s)

Ringkasan Sedang (51 token)

Metrik Tanpa Cache Dengan Cache Perubahan
Waktu evaluasi prompt 3.883,38 ms 3.868,64 ms ~tetap
Kecepatan generasi 3,75 token/detik 4,15 token/detik 10,6% lebih cepat
Latensi total 38,71 s 35,37 s 8,6% lebih cepat (hemat 3,34 s)

Konteks RAG Panjang (92 token)

Metrik Tanpa Cache Dengan Cache Perubahan
Waktu evaluasi prompt 13.604,23 ms 232,82 ms ๐Ÿš€ 98,3% lebih cepat
Kecepatan generasi 3,58 token/detik 3,58 token/detik stabil
Latensi total 50,17 s 36,65 s 26,9% lebih cepat (hemat 13,52 s)

Polanya sama di ketiga skenario: jaringan cuma faktor kecil yang nyaris tidak berpengaruh (rounding error). Setiap peningkatan berarti di sini datang dari prompt cache โ€” bukan dari lewat alamat IP mana permintaan itu berjalan.


Apa yang Benar-Benar Kami Pelajari

1. Prompt cache yang melakukan hampir semua pekerjaan berat

Pada kueri konteks RAG panjang, waktu evaluasi prompt turun dari 13,6 detik menjadi 0,23 detik โ€” pemotongan 98,3%. Ini murni berkat KV-cache Ollama yang menjaga awalan system-prompt yang sama tetap "hangat" di RAM. Artinya, siapa pun yang mengajukan pertanyaan lanjutan โ€” atau dua pengunjung berbeda yang kebetulan menyentuh konteks serupa โ€” bisa melewati hampir seluruh jeda "berpikir". Ini trik prefix-caching yang sama dari Bagian I, hanya kali ini diukur di bawah lalu lintas produksi yang nyata dan berantakan, bukan benchmark yang bersih dan terkontrol.

2. Jangan biarkan siapa pun melihat kesalahan cURL mentah

Saat beban sedang tinggi, atau tepat setelah cold start ketika model masih "memanas", pengunjung kadang melihat pesan seperti Operation timed out after 120002 ms. Pesan itu sangat akurat secara teknis, tapi sama sekali tidak ramah untuk manusia biasa. Sekarang, OpenAiCompatibleClient.php menangkap kegagalan transportasi ini dan menampilkan pesan yang lebih bersahabat: "Asisten AI kami sedang memanasโ€ฆ" โ€” sementara kesalahan aslinya tetap dicatat ke file log untuk keperluan debugging. Perbaikan kecil, tapi kesan pertama jadi jauh lebih baik.

3. Jawaban yang terputus di tengah kalimat

Ringkasan halaman yang kompleks kadang menabrak batas anggaran token dan berhenti tiba-tiba, di tengah pemikiran. Solusinya dua hal: menaikkan max_tokens dari 128 menjadi 256 di ai-chatbot.yaml, dan menambahkan batas pemotongan konteks yang lebih tepat di ContextIndexer.php. Hasilnya, jawaban tidak lagi terpotong mendadak, tanpa mengorbankan kecepatan respons secara signifikan โ€” ternyata sebagian besar jawaban cuma butuh sedikit ruang ekstra untuk menyelesaikan kalimatnya.


Apa Selanjutnya

Pelacakan biaya per token yang sebenarnya. Rencananya, angka prompt_eval_count dan eval_count yang dilaporkan Ollama akan langsung di-parsing ke log interaksi, supaya dasbor admin menampilkan biaya dan throughput yang akurat โ€” bukan sekadar perkiraan.


Previous Post Next Post