Performance

Performance #

Playbook yang berjalan 30 menit untuk 50 server adalah hambatan nyata — tim menunggu, deployment memblok pekerjaan lain, dan feedback loop yang lambat membuat iterasi menjadi menyakitkan. Sebagian besar playbook Ansible bisa dipercepat secara signifikan dengan konfigurasi yang tepat tanpa mengubah satu baris logika pun. Artikel ini membahas teknik-teknik optimasi yang memberikan dampak terbesar.

Forks: Paralelisme Lebih Tinggi #

Default forks Ansible adalah 5 — Ansible hanya akan mengelola 5 host secara paralel sekaligus. Untuk infrastruktur yang lebih besar, naikkan nilai ini:

# ansible.cfg
[defaults]
forks = 20    # Eksekusi di 20 host secara paralel
# Atau override saat runtime
ansible-playbook site.yml -f 30

Nilai yang tepat tergantung pada spesifikasi control node dan kapasitas jaringan. Mulai dari 20, pantau penggunaan CPU dan RAM control node, naikan secara bertahap.


SSH Pipelining #

Secara default, Ansible mengirim module Python ke managed node via SFTP, kemudian mengeksekusinya via SSH terpisah. SSH pipelining menggabungkan kedua langkah ini menjadi satu koneksi, menghilangkan round-trip tambahan:

# ansible.cfg
[ssh_connection]
pipelining = true

SSH pipelining membutuhkan requiretty dinonaktifkan di sudoers managed node. Pastikan baris berikut ada di /etc/sudoers:

Defaults !requiretty

Atau tambahkan via Ansible sebelum mengaktifkan pipelining.

Dampaknya bisa signifikan — pipelining bisa memangkas waktu eksekusi 20–50% untuk play dengan banyak task pendek.


SSH Multiplexing (ControlMaster) #

SSH multiplexing memungkinkan beberapa koneksi SSH menggunakan satu TCP connection yang sudah ada, menghilangkan overhead handshake SSH di setiap koneksi baru:

# ansible.cfg
[ssh_connection]
pipelining = true
ssh_args = -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r

ControlPersist=60s menjaga koneksi master tetap aktif 60 detik setelah sesi terakhir ditutup — koneksi berikutnya ke host yang sama akan langsung menggunakan multiplexed connection.


Fact Caching #

Gathering facts membutuhkan koneksi SSH ke setiap host dan mengeksekusi module setup. Untuk infrastruktur besar, ini bisa memakan 1-3 detik per host:

# ansible.cfg
[defaults]
gathering = smart           # Hanya kumpulkan jika belum di-cache
fact_caching = jsonfile
fact_caching_connection = /tmp/ansible_facts_cache
fact_caching_timeout = 3600  # Cache berlaku 1 jam

Dengan gathering = smart, Ansible hanya menjalankan gathering facts jika:

  • Host belum pernah di-cache, atau
  • Cache untuk host tersebut sudah expired
# Refresh cache manual jika diperlukan
ansible -i inventory/ all -m setup --tree /tmp/ansible_facts_cache

Nonaktifkan Gathering Facts untuk Play yang Tidak Memerlukannya #

Jika play tidak menggunakan facts (tidak ada referensi ke ansible_* variables), nonaktifkan gathering:

- name: Quick deployment task
  hosts: webservers
  gather_facts: false     # Hemat 1-3 detik per host

  tasks:
    - name: Restart service
      systemd:
        name: myapp
        state: restarted

Free Strategy #

Secara default, Ansible menunggu semua host menyelesaikan satu task sebelum melanjutkan ke task berikutnya. Free strategy membiarkan setiap host berjalan secepat mungkin:

- name: Deployment paralel penuh
  hosts: webservers
  strategy: free        # Setiap host berjalan independen

  tasks:
    - name: Pull kode
      git:
        repo: https://github.com/company/app.git
        dest: /opt/app
        version: "{{ version }}"

    - name: Install dependencies
      pip:
        requirements: /opt/app/requirements.txt
        virtualenv: /opt/app/venv

Gunakan free strategy dengan hati-hati — ia cocok saat task tidak bergantung satu sama lain dan urutan penyelesaian tidak penting.


Profiling: Temukan Bottleneck #

Sebelum mengoptimasi, ukur dulu di mana waktu dihabiskan:

# ansible.cfg — aktifkan callback profiling
[defaults]
callbacks_enabled = profile_tasks, profile_roles, timer

Dengan profile_tasks, Ansible akan menampilkan waktu eksekusi untuk setiap task di akhir run:

Thursday 15 March 2024  14:30:00 +0700 (0:00:00.015)  0:05:43.456 ****
===============================================================================
Gathering Facts -------------------------------------------------- 45.23s
Deploy konfigurasi nginx ----------------------------------------- 12.44s
Install semua package -------------------------------------------- 38.19s
...

Dari output ini, kamu bisa melihat task mana yang paling lambat dan fokus optimasi di sana.


Ringkasan #

  • Naikkan forks dari default 5 ke 20-50 tergantung kapasitas control node — ini adalah optimasi dengan dampak paling besar untuk infrastruktur besar.
  • SSH pipelining (pipelining = true) memangkas 20-50% waktu eksekusi — aktifkan segera, tapi pastikan requiretty dinonaktifkan di sudoers.
  • SSH multiplexing (ControlMaster=auto) menghilangkan overhead handshake SSH berulang — sangat efektif untuk play dengan banyak task pendek.
  • Fact caching (gathering = smart) menghindari pengumpulan ulang facts yang sama — efektif untuk playbook yang sering dijalankan.
  • gather_facts: false untuk play yang tidak menggunakan facts sama sekali — penghematan langsung tanpa trade-off.
  • profile_tasks callback untuk mengukur sebelum mengoptimasi — jangan tebak, ukur dulu di mana bottleneck-nya.

← Sebelumnya: Delegation & Local Action   Berikutnya: Testing →

About | Author | Content Scope | Editorial Policy | Privacy Policy | Disclaimer | Contact