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).
CatatanAck-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.
CatatanFitur 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.
Statistik uji yang disediakan dalam topik ini adalah nilai teoretis. Nilai aktual mungkin bervariasi berdasarkan lingkungan Anda.

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:
Gunakan anotasi
metadata.annotations/koordinator.sh/memoryLocalityuntuk mengaktifkan fitur percepatan akses memori terdekat untuk pod individu. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Percepatan Akses Memori Terdekat untuk Pod Individu.Konfigurasikan parameter
memoryLocalitydalamconfigmap/ack-slo-configConfigMap untuk mengaktifkan fitur percepatan akses memori terdekat untuk semua pod dari kelas kualitas layanan (QoS) tertentu. Untuk informasi lebih lanjut, lihat Aktifkan Fitur Percepatan Akses Memori Terdekat untuk Semua Pod dari Kelas QoS Tertentu.
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"}' --overwriteNilai 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
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-systemJalankan perintah berikut untuk memeriksa apakah
configmap/ack-slo-configConfigMap ada di namespace kube-system:Untuk menghindari mengubah pengaturan QoS asli, periksa apakah
ack-slo-configConfigMap ada.kubectl get cm ack-slo-config -n kube-systemJika
configmap/ack-slo-configConfigMap tidak ada, jalankan perintah berikut untuk membuatnya:kubectl apply -f ml-config.yamlJika
configmap/ack-slo-configConfigMap 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 0Bidang
completeddalam 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 0Bidang
completeddalam 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 numaOutput 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
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}' --overwriteParameter 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.
CatatanJika 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
Gunakan template YAML berikut untuk menerapkan aplikasi Redis:
Modifikasi bidang
redis-configberdasarkan 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.confTingkatkan beban memori.
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=300danmax-in-cir=1000000ditentukan.CatatanWaktu 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> doneSelama 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 --membindpada mesin yang diuji untuk menentukan node NUMA tempat beban kerja diterapkan.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.CatatanvCore 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-numdanmalloc-size-per-workersberdasarkan beban pada node. Anda dapat menjalankan perintahnumactl -Huntuk menanyakan pemanfaatan memori setiap node NUMA.numactl --membind=<numa-id> stress -m <workers-num> --vm-bytes <malloc-size-per-workers>
Gunakan redis-benchmark untuk melakukan uji stres dengan percepatan akses memori terdekat diaktifkan dan dinonaktifkan.
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.
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>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>
Aktifkan percepatan akses memori terdekat untuk aplikasi Redis
Jalankan perintah berikut untuk mengaktifkan percepatan akses memori terdekat untuk aplikasi Redis:
kubectl annotate pod redis koordinator.sh/memoryLocality='{"policy": "BestEffort"}' --overwriteJalankan 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 redisOutput 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
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.
Hasil uji mungkin bervariasi berdasarkan alat uji stres yang digunakan. Hasil uji berikut didasarkan pada tipe instance ecs.ebmc8i.48xlarge dan ecs.ebmg7a.64xlarge.
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.

