NetACC adalah pustaka mode pengguna yang mempercepat aplikasi TCP melalui eRDMA dengan antarmuka soket yang kompatibel—tanpa perubahan kode.
NetACC berada dalam pratinjau publik.
Kasus penggunaan
NetACC cocok untuk skenario dengan overhead jaringan tinggi.
Workload dengan paket per detik (PPS) tinggi, terutama traffic paket kecil. NetACC mengurangi overhead CPU dan meningkatkan throughput, seperti saat Redis memproses permintaan.
Workload sensitif latensi: eRDMA memberikan latensi lebih rendah dibanding TCP, sehingga mempercepat respons jaringan.
Koneksi singkat yang sering: NetACC mempercepat pembentukan koneksi, mengurangi waktu pembuatan, dan meningkatkan performa.
Instal NetACC
Metode instalasi
Gunakan driver eRDMA untuk menginstal NetACC
NetACC diinstal secara otomatis bersama driver eRDMA. Lihat Aktifkan eRDMA pada topik "Use eRDMA".
Instal NetACC secara terpisah
Untuk menginstal versi tertentu NetACC atau menggunakannya sementara pada Instance ECS, jalankan:
sudo curl -fsSL https://netacc-release.oss-cn-hangzhou.aliyuncs.com/release/netacc_download_install.sh | sudo sh
Berkas konfigurasi dan parameter yang dioptimalkan
Setelah instalasi, berkas konfigurasi
/etc/netacc.confdihasilkan secara otomatis. Anda dapat menyesuaikan parameter berikut berdasarkan workload Anda:NACC_SOR_MSG_SIZE: ukuran buffer.NACC_RDMA_MR_MIN_INC_SIZE: ukuran Wilayah Memori (MR) pertama yang didaftarkan oleh RDMA.NACC_RDMA_MR_MAX_INC_SIZE: ukuran maksimum MR yang didaftarkan oleh RDMA.NACC_SOR_CONN_PER_QP: koneksi per Queue Pair (QP).NACC_SOR_IO_THREADS: jumlah thread NetACC.
Contoh berikut menunjukkan berkas konfigurasi sampel:
Gunakan NetACC
Gunakan NetACC dalam aplikasi dengan menjalankan perintah netacc_run atau mengatur variabel lingkungan LD_PRELOAD. Baca bagian Pertimbangan sebelum melanjutkan.
Jalankan perintah netacc_run
netacc_run memuat NetACC saat startup aplikasi. Tambahkan awalan perintah aplikasi Anda dengan netacc_run untuk menjalankan aplikasi dengan NetACC diaktifkan.
netacc_run menerima parameter seperti -t (thread I/O) dan -p (koneksi per QP). Parameter yang ditentukan saat menjalankan perintah netacc_run menggantikan berkas konfigurasi.
Contoh:
Contoh berikut menggunakan Redis. Tambahkan awalan perintah Redis dengan
netacc_rununtuk menjalankan Redis dengan NetACC.Jalankan Redis dengan NetACC:
netacc_run redis-serverJalankan redis-benchmark dengan NetACC:
netacc_run redis-benchmark
Konfigurasikan variabel lingkungan LD_PRELOAD
Variabel lingkungan LD_PRELOAD menentukan pustaka bersama yang dimuat sebelum program dijalankan. Atur ke pustaka NetACC dalam variabel LD_PRELOAD untuk memuat secara otomatis.
Cari lokasi pustaka dinamis NetACC:
ldconfig -p | grep netaccContoh output:
[ecs-user@i ~]$ ldconfig -p | grep netacc libnetacc-preload.so (libc6,x86-64) => /lib64/libnetacc-preload.so libnetacc_cx.so (libc6,x86-64) => /lib64/libnetacc_cx.so [ecs-user@i ~]$Atur variabel lingkungan
LD_PRELOADke pustaka bersama NetACC:LD_PRELOAD=/lib64/libnetacc-preload.so your_applicationGanti
your_applicationdengan aplikasi target.Contoh (Redis):
Jalankan Redis dengan NetACC:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-serverJalankan redis-benchmark dengan NetACC:
LD_PRELOAD=/lib64/libnetacc-preload.so redis-benchmark
Pantau NetACC
netacc_ss adalah tool pemantauan NetACC. Jalankan perintah netacc_ss untuk memeriksa status transfer data proses TCP yang dipercepat NetACC. Anda dapat menjalankannya baik di server maupun client.
Periksa status transfer data proses TCP yang dipercepat NetACC:
netacc_ss -s all -p <Process ID>Untuk mencari Process ID, jalankan ps -ef | grep <Nama Proses>.
Catatan penggunaan
Hanya koneksi TCP yang dibentuk melalui ENI dengan fitur eRDMA Interface (ERI) yang diaktifkan yang dikonversi menjadi koneksi RDMA. Koneksi lain tetap menggunakan TCP.
CatatanJika salah satu ujung komunikasi tidak memiliki ENI dengan ERI yang diaktifkan, NetACC akan fallback ke TCP.
Deskriptor file soket RDMA tidak dapat dikirim ke proses lain melalui IPC kernel.
CatatanKoneksi RDMA terikat ke QP tertentu yang tidak dapat dibagikan antar proses.
NetACC tidak mendukung IPv6. Untuk mencegah konflik, nonaktifkan IPv6 dengan menjalankan
sysctl net.ipv6.conf.all.disable_ipv6=1.NetACC tidak mendukung pembaruan panas (hot update). Hentikan semua proses yang dipercepat NetACC sebelum memperbarui NetACC.
NetACC tidak mendukung opsi soket TCP tertentu, seperti SO_REUSEPORT, SO_ZEROCOPY, dan TCP_INQ.
NetACC bergantung pada glibc dan tidak dapat dijalankan di lingkungan non-glibc, seperti Golang.
Sebelum menggunakan NetACC, atur memori lockable maksimum ke unlimited dengan menjalankan
ulimit -l unlimited.CatatanJika nilai ulimit -l terlalu kecil, RDMA mungkin gagal mendaftarkan MR yang melebihi batas tersebut.
Saat aplikasi yang dipercepat NetACC mendengarkan pada port TCP, NetACC juga mendengarkan pada port RDMA (port TCP + 20000) untuk transfer data RDMA.
CatatanJika port RDMA sedang digunakan atau berada di luar rentang valid, koneksi akan gagal. Alokasikan port dengan tepat untuk menghindari konflik.
Proses anak tidak mewarisi koneksi soket yang dibentuk oleh proses induk setelah pemanggilan
fork().CatatanProses anak harus membentuk koneksi soket baru.
Penggunaan ulang QP dinonaktifkan secara default.
Untuk mengaktifkan penggunaan ulang QP, atur koneksi per QP (-p) ke nilai lebih dari 1 melalui parameter
NACC_SOR_CONN_PER_QPdalam berkas konfigurasi NetACC atau perintahnetacc_run.Penggunaan ulang QP mengurangi jumlah QP, overhead manajemen, dan konsumsi sumber daya, sehingga meningkatkan efisiensi komunikasi dalam skenario konkurensi tinggi.
Dengan penggunaan ulang QP diaktifkan, beberapa koneksi RDMA dapat berbagi nomor port lokal karena nomor port mengidentifikasi QP, bukan koneksi individual.
CatatanJika aplikasi Anda memerlukan nomor port lokal yang berbeda (misalnya, untuk layanan berbeda), nonaktifkan penggunaan ulang QP untuk menghindari konflik port.
Gunakan NetACC dalam aplikasi Redis
Manfaat NetACC untuk aplikasi Redis
Throughput sistem meningkat
NetACC mengurangi overhead CPU dan meningkatkan throughput untuk workload Redis dengan PPS tinggi.
Respons jaringan dipercepat
NetACC memanfaatkan latensi rendah eRDMA untuk mempercepat respons jaringan Redis.
NetACC dalam benchmark performa Redis
redis-benchmark adalah utilitas bawaan Redis yang mengukur performa server dengan mensimulasikan permintaan klien bersamaan.
Skenario pengujian
Gunakan NetACC dengan redis-benchmark untuk mensimulasikan 100 klien pada 4 thread yang mengirim 5 juta permintaan SET.
Prasyarat
Buat dua Instance ECS yang mendukung eRDMA. Pilih Auto-install eRDMA Driver dan eRDMA Interface untuk mengaktifkan ERI pada ENI primer. Gunakan satu instans sebagai server Redis dan yang lain sebagai klien.
Konfigurasi instans:
Image: Alibaba Cloud Linux 3
Tipe instans: ecs.g8ae.4xlarge
Alamat IP privat ENI primer: 172.17.0.90 (server) dan 172.17.0.91 (klien). Ganti dengan nilai aktual dalam benchmark Anda.
CatatanBenchmark ini mengaktifkan ERI pada ENI primer. 172.17.0.90 adalah alamat IP privat ENI primer dari instans server Redis.
Jika ERI diaktifkan pada ENI sekunder, gunakan alamat IP privat mereka sebagai gantinya. Lihat Aktifkan eRDMA pada topik "Use eRDMA".
Prosedur
Sambungkan ke kedua Instance ECS (server dan klien Redis).
Lihat Menggunakan Workbench untuk log on ke instans Linux melalui SSH.
Verifikasi bahwa driver eRDMA telah diinstal.
Setelah instans dimulai, jalankan
ibv_devinfountuk memeriksa status driver eRDMA.Output berikut menunjukkan driver telah diinstal.
[root@redis-server ~]# ibv_devinfo hca_id: erdma_0 transport: eRDMA (1) fw_ver: 0.2.0 node_guid: 0216:3eff:fe10:d924 sys_image_guid: 0216:3eff:fe10:d924 vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet [root@redis-server ~]#Output berikut menunjukkan driver sedang diinstal. Tunggu beberapa menit lalu coba lagi.
[root@ixxxxxxxxxxxxx Z ~]# ibv_deninfo -bash: ibv_deninfo: command not found
Instal Redis pada kedua instans:
sudo yum install -y redisOutput berikut menunjukkan Redis telah diinstal.
[root@redis-server ~]# sudo yum install -y redis Last metadata expiration check: 0:06:35 ago on Tue 03 Sep 2024 10:50:07 AM CST. Dependencies resolved. ================================================================================ Package Architecture Version Repository Size ================================================================================ Installing: redis x86_64 6.2.7-1.0.2.al8 alinux3-updates 1.2 M Transaction Summary ================================================================================ Install 1 Package Total download size: 1.2 M Installed size: 4.3 M Downloading Packages: redis-6.2.7-1.0.2.al8.x86_64.rpm 15 MB/s | 1.2 MB 00:00 -------------------------------------------------------------------------------- Total 15 MB/s | 1.2 MB 00:00 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Running scriptlet: redis-6.2.7-1.0.2.al8.x86_64 1/1 Installing : redis-6.2.7-1.0.2.al8.x86_64 1/1 Running scriptlet: redis-6.2.7-1.0.2.al8.x86_64 1/1 Verifying : redis-6.2.7-1.0.2.al8.x86_64 1/1 Installed: redis-6.2.7-1.0.2.al8.x86_64 Complete! [root@redis-server ~]#Ukur performa Redis dengan
redis-benchmark.Lakukan benchmark menggunakan NetACC
Pada instans server Redis, jalankan Redis dengan NetACC:
netacc_run redis-server --port 6379 --protected-mode noCatatanGanti 6379 dengan port aktual Anda. Lihat Parameter umum yang digunakan bersama perintah redis-server.
Contoh ini menggunakan
netacc_run. Untuk metode lain, lihat Gunakan NetACC.
Output berikut menunjukkan Redis berhasil dijalankan.
[root@redis-server ~]# netacc_run redis-server --port 6379 --protected-mode no 114379:C 03 Sep 2024 10:59:24.477 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 114379:C 03 Sep 2024 10:59:24.477 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=114379, just started 114379:C 03 Sep 2024 10:59:24.477 # Configuration loaded 114379:M 03 Sep 2024 10:59:24.478 * monotonic clock: POSIX clock_gettime 114379:M 03 Sep 2024 10:59:24.479 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list. Redis 6.2.7 (00000000/0) 64 bit Running in standalone mode Port: 6379 PID: 114379 https://redis.io 114379:M 03 Sep 2024 10:59:24.479 # Server initialized 114379:M 03 Sep 2024 10:59:24.479 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 114379:M 03 Sep 2024 10:59:24.479 * Ready to accept connectionsPada instans klien Redis, jalankan redis-benchmark dengan NetACC:
netacc_run redis-benchmark -h 172.17.0.90 -p 6379 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t setCatatanGanti 172.17.0.90 dengan IP server Redis dan 6379 dengan port aktual. Lihat Parameter perintah umum yang digunakan dengan redis-benchmark.
Hasil benchmark dapat bervariasi tergantung kondisi jaringan. Data dalam topik ini hanya sebagai referensi.
Bagian Summary menunjukkan ~770.000 permintaan/detik. Untuk detail metrik, lihat Metrik umum dalam hasil benchmark redis-benchmark.
Lakukan benchmark tanpa NetACC
Pada instans server Redis, jalankan Redis:
redis-server --port 6379 --protected-mode no --saveCatatanGanti 6379 dengan port aktual Anda. Lihat Parameter umum yang digunakan bersama perintah redis-server.
Output berikut menunjukkan Redis berhasil dijalankan.
[root@redis-server ~]# redis-server --port 6379 --protected-mode no --save 114198:C 03 Sep 2024 10:57:28.957 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 114198:C 03 Sep 2024 10:57:28.957 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=114198, just started 114198:C 03 Sep 2024 10:57:28.957 # Configuration loaded 114198:M 03 Sep 2024 10:57:28.958 * monotonic clock: POSIX clock_gettime 114198:M 03 Sep 2024 10:57:28.958 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list. Redis 6.2.7 (00000000/0) 64 bit Running in standalone mode Port: 6379 PID: 114198 https://redis.io 114198:M 03 Sep 2024 10:57:28.958 # Server initialized 114198:M 03 Sep 2024 10:57:28.958 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 114198:M 03 Sep 2024 10:57:28.958 * Ready to accept connectionsPada instans klien Redis, jalankan redis-benchmark:
redis-benchmark -h 172.17.0.90 -c 100 -n 5000000 -r 10000 --threads 4 -d 512 -t setCatatanGanti 172.17.0.90 dengan IP server Redis dan 6379 dengan port aktual. Lihat Parameter perintah umum yang digunakan dengan redis-benchmark.
Hasil benchmark dapat bervariasi tergantung kondisi jaringan. Data dalam topik ini hanya sebagai referensi.
Bagian Summary menunjukkan ~330.000 permintaan/detik. Untuk detail metrik, lihat Metrik umum dalam hasil benchmark redis-benchmark.