全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan fitur percepatan akses memori terdekat pada instance multi-NUMA

更新时间:Jul 02, 2025

Fitur percepatan akses memori terdekat dari ack-koordinator memindahkan memori remote non-uniform memory access (NUMA) dari aplikasi yang terikat pada CPU ke server lokal secara aman. Hal ini meningkatkan rasio hit akses memori lokal dan performa aplikasi intensif memori. Topik ini menjelaskan cara menggunakan fitur tersebut serta memverifikasi peningkatan performanya.

Daftar isi

Prasyarat

  • Sebuah kluster Container Service for Kubernetes (ACK) Pro yang menjalankan Kubernetes 1.18 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang Dikelola.

  • Klien kubectl terhubung ke kluster. Untuk informasi lebih lanjut, lihat Dapatkan File kubeconfig Kluster dan Gunakan kubectl untuk Terhubung ke Kluster.

  • Ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager) versi 1.2.0-ack1.2 atau lebih baru telah diinstal. Untuk informasi lebih lanjut tentang cara menginstal ack-koordinator, lihat ack-koordinator (sebelumnya dikenal sebagai ack-slo-manager).

    Catatan

    Ack-koordinator mendukung semua fitur yang disediakan oleh resource-controller. Jika Anda saat ini menggunakan resource-controller, Anda harus menghapus instalasinya sebelum menginstal ack-koordinator. Untuk informasi lebih lanjut tentang cara menghapus resource-controller, lihat Hapus resource-controller.

  • Instance Elastic Compute Service (ECS) generasi kelima, keenam, ketujuh, atau kedelapan dari keluarga instance ecs.ebmc, ecs.ebmg, ecs.ebmgn, ecs.ebmr, ecs.ebmhfc, atau ecs.scc digunakan untuk menerapkan instance multi-NUMA.

    Catatan

    Fitur percepatan akses memori terdekat bekerja lebih baik pada instance ECS generasi kedelapan tipe ecs.ebmc8i.48xlarge, ecs.c8i.32xlarge, dan ecs.g8i.48xlarge. Untuk informasi lebih lanjut tentang keluarga instance ECS, lihat Keluarga Instance ECS.

  • Aplikasi diterapkan pada instance multi-NUMA. Core CPU diikat ke aplikasi dengan menggunakan fitur seperti penjadwalan CPU yang sadar topologi. Untuk informasi lebih lanjut, lihat Aktifkan Penjadwalan CPU yang Sadar Topologi.

Penagihan

Tidak ada biaya yang dikenakan saat Anda menginstal atau menggunakan komponen ack-koordinator. Namun, biaya mungkin dikenakan dalam skenario berikut:

  • ack-koordinator adalah komponen non-managed yang menggunakan sumber daya node pekerja setelah diinstal. Anda dapat menentukan jumlah sumber daya yang diminta oleh setiap modul saat Anda menginstal komponen.

  • Secara default, ack-koordinator mengekspos metrik pemantauan fitur seperti profiling sumber daya dan penjadwalan granular sebagai metrik Prometheus. Jika Anda mengaktifkan metrik Prometheus untuk ack-koordinator dan menggunakan Managed Service for Prometheus, metrik ini dianggap sebagai metrik kustom dan biaya akan dikenakan untuk metrik ini. Biaya tergantung pada faktor-faktor seperti ukuran kluster Anda dan jumlah aplikasi. Sebelum Anda mengaktifkan metrik Prometheus, kami sarankan Anda membaca topik Penagihan dari Managed Service for Prometheus untuk mempelajari tentang kuota gratis dan aturan penagihan metrik kustom. Untuk informasi lebih lanjut tentang cara memantau dan mengelola penggunaan sumber daya, lihat Kueri Jumlah Data Observabel dan Tagihan.

Manfaat fitur percepatan akses memori terdekat

Dalam arsitektur multi-NUMA, jika sebuah proses yang berjalan pada vCore dari node NUMA membutuhkan akses ke memori pada node NUMA remote, permintaan tersebut harus melewati bus QuickPath Interconnect (QPI). Waktu yang diperlukan untuk sebuah proses mengakses memori pada node NUMA remote lebih lama daripada waktu yang diperlukan untuk proses mengakses memori pada node NUMA lokal. Akses memori lintas node mengurangi rasio hit akses memori lokal dan performa aplikasi intensif memori.

Misalkan aplikasi Redis yang intensif memori diikat dengan semua vCore yang disediakan oleh instance ECS. Proses aplikasi Redis mungkin perlu mengakses vCore lintas node NUMA. Jika aplikasi Redis diterapkan pada instance ECS tipe ecs.ebmc8i.48xlarge, sebagian memori yang dibutuhkan oleh aplikasi didistribusikan ke node NUMA remote, seperti yang ditunjukkan pada gambar berikut. Hasil uji stres menunjukkan bahwa QPS redis-server ketika memori sepenuhnya didistribusikan ke node NUMA lokal 10,52% lebih tinggi daripada QPS redis-server ketika memori didistribusikan secara acak antara node NUMA lokal dan remote. Hasil uji stres juga menunjukkan bahwa QPS redis-server ketika memori sepenuhnya didistribusikan ke node NUMA lokal 26,12% lebih tinggi daripada QPS redis-server ketika memori sepenuhnya didistribusikan ke node NUMA remote. Gambar berikut menunjukkan perbandingannya.

Penting

Statistik uji yang disediakan dalam topik ini adalah nilai teoretis. Nilai aktual mungkin bervariasi berdasarkan lingkungan Anda.

QPS

Untuk mengoptimalkan akses memori untuk aplikasi, ack-koordinator menyediakan fitur percepatan akses memori terdekat. Jika Anda mengikat vCore ke aplikasi Anda dengan menggunakan fitur seperti penjadwalan CPU yang sadar topologi, kami sarankan Anda memindahkan memori dari node NUMA remote ke node lokal secara aman. Pemindahan ini tidak menyebabkan gangguan layanan.

Skema penggunaan

Fitur percepatan akses memori terdekat ideal untuk skenario berikut:

  • Beban kerja yang intensif memori, seperti database in-memory Redis berskala besar, diterapkan.

  • Instance ECS yang terintegrasi dengan Intel Data Streaming Accelerator (DSA) digunakan. DSA dapat meningkatkan performa fitur percepatan akses memori terdekat dan mengurangi konsumsi CPU.

Gunakan fitur percepatan akses memori terdekat

Langkah 1: Gunakan kebijakan untuk mengaktifkan fitur percepatan akses memori terdekat

Anda dapat menggunakan salah satu metode berikut untuk mengaktifkan fitur percepatan akses memori terdekat:

Enable the nearby memory access acceleration feature for individual pods

Jalankan perintah berikut untuk mengaktifkan fitur percepatan akses memori terdekat untuk pod Redis yang terikat pada CPU:

kubectl annotate pod <pod-name> koordinator.sh/memoryLocality='{"policy": "bestEffort"}' --overwrite

Nilai valid parameter policy:

  • bestEffort: segera mempercepat permintaan individu ke memori terdekat.

  • none: menonaktifkan fitur percepatan akses memori terdekat.

Enable the nearby memory access acceleration feature for all pods of the specified QoS class

  1. Buat file bernama ml-config.yaml dan salin konten berikut ke file:

    apiVersion: v1
    data:
      resource-qos-config: |-
        {
          "clusterStrategy": {
            "lsClass": {
               "memoryLocality": {
                 "policy": "bestEffort"
               }
             }
          }
        }
    kind: ConfigMap
    metadata:
      name: ack-slo-config
      namespace: kube-system
  2. Jalankan perintah berikut untuk memeriksa apakah configmap/ack-slo-config ConfigMap ada di namespace kube-system:

    Untuk menghindari mengubah pengaturan QoS asli, periksa apakah ack-slo-config ConfigMap ada.

    kubectl get cm ack-slo-config -n kube-system
    • Jika configmap/ack-slo-config ConfigMap tidak ada, jalankan perintah berikut untuk membuatnya:

      kubectl apply -f ml-config.yaml
    • Jika configmap/ack-slo-config ConfigMap ada, jalankan perintah berikut untuk mengaktifkan fitur percepatan akses memori terdekat:

      kubectl patch cm -n kube-system ack-slo-config --patch "$(cat ml-config.yaml)"

Langkah 2: Periksa event pod untuk memverifikasi fitur percepatan akses memori terdekat

Jalankan perintah berikut untuk memverifikasi fitur percepatan akses memori terdekat:

kubectl describe pod <pod-name>
  • Output yang Diharapkan 1:

      Normal  MemoryLocalityCompleted  6s    koordlet  Container <container-name-1> completed: migrated memory from remote numa: 1 to local numa: 0
    Container <container-name-2> completed: migrated memory from remote numa: 0 to local numa: 1
    Total: 2 container(s) completed, 0 failed, 0 skipped; cur local memory ratio 100, rest remote memory pages 0

    Bidang completed dalam output menunjukkan bahwa akses memori dipercepat oleh fitur percepatan akses memori terdekat. Event ini mencatat arah migrasi memori setiap kontainer dan rasio distribusi halaman memori setelah memori dipindahkan ke node NUMA lokal.

  • Output yang Diharapkan 2:

      Normal  MemoryLocalityCompleted  6s    koordlet  Container <container-name-1> completed: migrated memory from remote numa: 1 to local numa: 0
    Container <container-name-2> completed: failed to migrate the following processes: failed pid: 111111, error: No such process,from remote numa: 0 to local numa: 1
    Total: 2 container(s) completed, 0 failed, 0 skipped; cur local memory ratio 100, rest remote memory pages 0

    Bidang completed dalam output menunjukkan bahwa fitur percepatan akses memori terdekat gagal mempercepat akses ke memori terdekat. Misalnya, fitur gagal memigrasi memori karena proses dihentikan selama migrasi. Event ini mencatat ID proses yang dihentikan.

  • Output yang Diharapkan 3:

      Normal  MemoryLocalitySkipped  1s    koordlet  no target numa

    Output menunjukkan bahwa fitur percepatan akses memori terdekat melewati migrasi memori ketika tidak ada node NUMA remote. Ini karena instance ECS menggunakan arsitektur non-NUMA atau proses berjalan di semua node NUMA.

  • Output yang Diharapkan 4:

    Error lain dikembalikan. Misalnya, event MemoryLocalityFailed dihasilkan bersama dengan pesan error.

(Opsional) Langkah 3: Percepat beberapa permintaan ke memori terdekat

Catatan
  • Jika Anda telah mempercepat permintaan individu ke memori terdekat, pastikan percepatan terbaru selesai sebelum Anda mempercepat beberapa permintaan ke memori terdekat.

  • Saat Anda mempercepat beberapa permintaan ke memori terdekat, hasil percepatan dicatat dalam event hanya ketika perubahan hasil percepatan akses memori terdekat melebihi 10% atau perubahan rasio distribusi halaman memori melebihi 10% setelah memori dipindahkan ke node NUMA lokal.

Jalankan perintah berikut untuk mempercepat beberapa permintaan ke memori terdekat:

kubectl annotate pod <pod-name> koordinator.sh/memoryLocality='{"policy": "bestEffort","migrateIntervalMinutes":10}' --overwrite

Parameter migrateIntervalMinutes menentukan interval minimum antara dua permintaan yang dipercepat. Unit: menit. Nilai valid:

  • 0: segera mempercepat permintaan individu ke memori terdekat.

  • > 0: segera mempercepat permintaan ke memori terdekat.

  • none: menonaktifkan fitur percepatan akses memori terdekat.

Verifikasi bahwa fitur percepatan akses memori terdekat meningkatkan performa aplikasi yang intensif memori

Lingkungan Uji

  • Server atau VM multi-NUMA diterapkan. Server atau VM digunakan untuk menerapkan aplikasi intensif memori dan berfungsi sebagai mesin yang diuji. Dalam contoh ini, tipe instance ecs.ebmc8i.48xlarge dan ecs.ebmg7a.64xlarge digunakan.

  • Mesin uji stres yang dapat terhubung ke mesin yang diuji diterapkan.

  • Aplikasi Redis multi-thread yang meminta 4 vCore dan 32 GB memori diterapkan.

    Catatan

    Jika mesin yang diuji menggunakan spesifikasi yang relatif rendah, Anda dapat menerapkan aplikasi Redis single-thread dan mengatur permintaan CPU dan memori ke nilai yang lebih kecil.

Prosedur Uji 测试流程Prosedur Uji

  1. Gunakan template YAML berikut untuk menerapkan aplikasi Redis:

    Modifikasi bidang redis-config berdasarkan spesifikasi mesin yang diuji.

    ---
    kind: ConfigMap
    apiVersion: v1
    metadata:
      name: example-redis-config
    data:
      redis-config: |
        maxmemory 32G                  
        maxmemory-policy allkeys-lru
        io-threads-do-reads yes        
        io-threads 4                   
    ---
    kind: Service
    apiVersion: v1
    metadata:
      name: redis
    spec:
      type: NodePort
      ports:
        - port: 6379
          targetPort: 6379
          nodePort: 32379
      selector:
        app: redis
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: redis
      annotations:
        cpuset-scheduler: "true"        # Ikat vCore dengan menggunakan penjadwalan CPU yang sadar topologi.
      labels:
        app: redis
    spec:
      containers:
      - name: redis
        image: redis:6.0.5
        command: ["bash", "-c", "redis-server /redis-master/redis.conf"]
        ports:
        - containerPort: 6379
        resources:
          limits:
            cpu: "4"                  # Modifikasi nilai berdasarkan spesifikasi mesin yang diuji.
        volumeMounts:
        - mountPath: /redis-master-data
          name: data
        - mountPath: /redis-master
          name: config
      volumes:
        - name: data
          emptyDir: {}
        - name: config
          configMap:
            name: example-redis-config
            items:
            - key: redis-config
              path: redis.conf
  2. Tingkatkan beban memori.

    1. Tulis data bisnis ke aplikasi Redis.

      Eksekusi skrip shell berikut untuk menulis data ke redis-server dalam batch menggunakan pipeline. <max-out-cir> dan <max-out-cir> menentukan jumlah data yang ditulis ke redis-server. Dalam contoh ini, data ditulis ke aplikasi Redis yang meminta 4 vCore dan 32 GB memori. Oleh karena itu, max-our-cir=300 dan max-in-cir=1000000 ditentukan.

      Catatan

      Waktu yang cukup lama diperlukan untuk menulis sejumlah besar data. Untuk meningkatkan kecepatan tulis, kami sarankan Anda melakukan operasi tulis pada mesin yang diuji.

      for((j=1;j<=<max-out-cir>;j++))
      do
              echo "set k$j-0 v$j-0" > data.txt
              for((i=1;i<=<max-in-cir>;i++))
              do
                      echo "set k$j-$i v$j-$i" >> data.txt
              done
              echo "$j"
              unix2dos data.txt  # Untuk menulis data menggunakan pipeline, Anda harus menggunakan format DOS.
              cat data.txt | redis-cli --pipe -h <redis-server-IP> -p <redis-server-port>
      done

      Selama proses tulis, tingkatkan beban memori pada beban kerja yang diterapkan dalam mode penerapan hybrid pada node NUMA tempat aplikasi Redis dijadwalkan. Ini mensimulasikan situasi di mana memori yang digunakan oleh aplikasi Redis dipindahkan ke memori pada node NUMA lainnya karena lonjakan beban memori.

      Jalankan perintah numactl --membind pada mesin yang diuji untuk menentukan node NUMA tempat beban kerja diterapkan.

    2. Jalankan perintah uji stres berikut untuk meningkatkan beban memori.

      <workers-num> menentukan jumlah proses dan <malloc-size-per-workers> menentukan jumlah memori yang dialokasikan ke setiap proses.

      Catatan

      vCore diikat ke aplikasi Redis. Oleh karena itu, memori pada node NUMA lokal lebih diutamakan dialokasikan ke aplikasi Redis hingga pemanfaatan memori pada node NUMA lokal mencapai 100%. Atur workers-num dan malloc-size-per-workers berdasarkan beban pada node. Anda dapat menjalankan perintah numactl -H untuk menanyakan pemanfaatan memori setiap node NUMA.

      numactl --membind=<numa-id> stress -m <workers-num> --vm-bytes <malloc-size-per-workers>
  3. Gunakan redis-benchmark untuk melakukan uji stres dengan percepatan akses memori terdekat diaktifkan dan dinonaktifkan.

    1. Lakukan uji stres dengan percepatan akses memori terdekat dinonaktifkan

      Setelah Anda menulis data ke aplikasi Redis, gunakan redis-benchmark untuk mengirim permintaan dari mesin uji stres ke mesin yang diuji untuk menghasilkan beban sedang dan beban tinggi pada redis-server.

      1. Jalankan perintah berikut untuk mengirim 500 permintaan konkuren untuk menghasilkan beban sedang pada redis-server:

        redis-benchmark -t GET -c 500 -d 4096 -n 2000000 -h <redis-server-IP> -p <redis-server-port>
      2. Jalankan perintah berikut untuk mengirim 10.000 permintaan konkuren untuk menghasilkan beban tinggi pada redis-server:

        redis-benchmark -t GET -c 10000 -d 4096 -n 2000000 -h <redis-server-IP> -p <redis-server-port>
    2. Aktifkan percepatan akses memori terdekat untuk aplikasi Redis

      1. Jalankan perintah berikut untuk mengaktifkan percepatan akses memori terdekat untuk aplikasi Redis:

        kubectl annotate pod redis koordinator.sh/memoryLocality='{"policy": "BestEffort"}' --overwrite
      2. Jalankan perintah berikut untuk memverifikasi percepatan akses memori terdekat:

        Jika jumlah memori pada node NUMA remote besar, waktu yang cukup lama diperlukan untuk memindahkan memori dari node NUMA remote ke node NUMA lokal.

        kubectl describe pod redis

        Output yang diharapkan:

          Normal  MemoryLocalitySuccess  0s   koordlet-resmanager  migrated memory from remote numa: 0 to local numa: 1, cur local memory ratio 98, rest remote memory pages 28586
    3. Lakukan uji stres dengan percepatan akses memori terdekat diaktifkan

      Lakukan uji stres untuk menghasilkan beban sedang dan beban tinggi pada redis-server.

Analisis Hasil Uji

Dalam topik ini, instance tipe ecs.ebmc8i.48xlarge dan ecs.ebmg7a.64xlarge diuji. Bagian berikut menjelaskan hasil uji.

Penting

Hasil uji mungkin bervariasi berdasarkan alat uji stres yang digunakan. Hasil uji berikut didasarkan pada tipe instance ecs.ebmc8i.48xlarge dan ecs.ebmg7a.64xlarge.

Tampilkan Hasil Uji dan Analisis untuk ecs.ebmc8i.48xlarge

  • Perbandingan Distribusi Memori

    Gambar berikut menunjukkan bahwa rasio halaman memori lokal adalah 43% sebelum percepatan akses memori terdekat diaktifkan dan rasio halaman memori lokal adalah 98% setelah percepatan akses memori terdekat diaktifkan.加速1

  • Perbandingan Hasil Uji Stres

    • 500 permintaan konkuren

      Skenario uji

      P99 ms

      P99.99 ms

      QPS

      Sebelum percepatan akses memori terdekat diaktifkan

      3

      9,6

      122139,91

      Setelah percepatan akses memori terdekat diaktifkan

      3

      8,2

      129367,11

    • 10.000 permintaan konkuren

      Skenario uji

      P99 ms

      P99.99 ms

      QPS

      Sebelum percepatan akses memori terdekat diaktifkan

      115

      152,6

      119895,56

      Setelah percepatan akses memori terdekat diaktifkan

      101

      145,2

      125401,44

    Analisis:

    • Konkurensi sedang (500 permintaan konkuren): Setelah percepatan akses memori terdekat diaktifkan, latensi 99% permintaan tetap sama, latensi 99,99% permintaan berkurang sebesar 14,58%, dan QPS aplikasi Redis meningkat sebesar 5,917%.

    • Konkurensi tinggi (10.000 permintaan konkuren): Setelah percepatan akses memori terdekat diaktifkan, latensi 99% permintaan berkurang sebesar 12,17%, latensi 99,99% permintaan berkurang sebesar 4,85%, dan QPS aplikasi Redis meningkat sebesar 4,59%.

Tampilkan Hasil Uji dan Analisis untuk ecs.ebmg7a.64xlarge

  • Perbandingan Distribusi Memori

    Gambar berikut menunjukkan bahwa rasio halaman memori lokal adalah 47% sebelum percepatan akses memori terdekat diaktifkan dan rasio halaman memori lokal adalah 88% setelah percepatan akses memori terdekat diaktifkan.加速2对比

  • Perbandingan Hasil Uji Stres

    • 500 permintaan konkuren

      Skenario uji

      P99 ms

      P99.99 ms

      QPS

      Sebelum percepatan akses memori terdekat diaktifkan

      2,4

      4,4

      135180,99

      Setelah percepatan akses memori terdekat diaktifkan

      2,2

      4,4

      136296,37

    • 10.000 permintaan konkuren

      Skenario uji

      P99 ms

      P99.99 ms

      QPS

      Sebelum percepatan akses memori terdekat diaktifkan

      58,2

      80,4

      95757,10

      Setelah percepatan akses memori terdekat diaktifkan

      56,6

      76,8

      97015,50

    Analisis:

    • Konkurensi sedang (500 permintaan konkuren): Setelah percepatan akses memori terdekat diaktifkan, latensi 99% permintaan berkurang sebesar 8,33%, latensi 99,99% permintaan tetap sama, dan QPS aplikasi Redis meningkat sebesar 0,83%.

    • Konkurensi tinggi (10.000 permintaan konkuren): Setelah percepatan akses memori terdekat diaktifkan, latensi 99% permintaan berkurang sebesar 2,7%, latensi 99,99% permintaan berkurang sebesar 4,4%, dan QPS aplikasi Redis meningkat sebesar 1,3%.

Kesimpulan: Ketika beban memori relatif tinggi dan data aplikasi disimpan dalam memori node NUMA remote, akses memori dari aplikasi dipengaruhi oleh rasio halaman memori lokal. Setelah vCore diikat ke aplikasi dan percepatan akses memori terdekat diaktifkan, latensi akses dan throughput aplikasi Redis dioptimalkan baik pada konkurensi sedang maupun tinggi.