Apabila menggunakan sistem Linux, kami sering menghadapi beberapa tugas intensif CPU, seperti pemprosesan data, menyusun atur cara, dll., yang memerlukan sejumlah besar sumber pengkomputeran untuk diselesaikan. Walau bagaimanapun, jika konfigurasi perkakasan sistem kami rendah, ia akan menyebabkan pelaksanaan tugas yang perlahan dan menjejaskan kecekapan kerja kami secara serius. Untuk menangani masalah ini, artikel ini akan memperkenalkan teknologi yang dipanggil "CPU binding", yang boleh mengikat proses ke teras CPU tertentu, dengan itu meningkatkan kecekapan pelaksanaan proses tersebut.
Untuk aplikasi biasa, mekanisme penjadualan lalai sistem pengendalian tiada masalah. Walau bagaimanapun, apabila sesuatu proses memerlukan kecekapan operasi yang lebih tinggi, adalah perlu untuk mempertimbangkan untuk mengikatnya pada teras yang berasingan untuk mengurangkan overhed yang disebabkan oleh penjadualan pada teras yang berbeza.
Selepas mengikat proses/benang pada teras CPU tertentu, proses akan sentiasa berjalan pada teras ini dan tidak akan dijadualkan ke teras lain oleh sistem pengendalian. Tetapi teras terikat mungkin masih dijadualkan untuk menjalankan aplikasi lain.
Penjadualan CPU berbilang teras oleh sistem pengendalian
Pada masa ini, kedua-dua Windows dan Linux menyokong penjadualan dan pengurusan CPU berbilang teras.
Teras pembangunan perisian dalam persekitaran berbilang teras ialah pembangunan berbilang benang. Multi-threading ini bukan sahaja mewakili multi-threading dalam pelaksanaan perisian, tetapi juga memerlukan penggunaan teknologi multi-threading dalam perkakasan.
Tumpuan sistem pengendalian berbilang teras adalah pada peruntukan proses dan penjadualan. Peruntukan proses memperuntukkan proses kepada teras fizikal yang munasabah, kerana teras yang berbeza mempunyai perkongsian dan keadaan operasi sejarah yang berbeza. Sesetengah teras fizikal boleh berkongsi cache tahap kedua, sementara yang lain adalah bebas. Jika proses dengan perkongsian data diperuntukkan kepada teras dengan cache sekunder yang dikongsi, prestasi akan bertambah baik jika tidak, prestasi mungkin terjejas.
Penjadualan proses akan melibatkan isu seperti prestasi masa nyata dan pengimbangan beban Isu-isu hangat penyelidikan semasa terutamanya tertumpu pada aspek berikut:
Situasi apabila berbilang proses dan berbilang benang berjalan pada teras CPU adalah seperti berikut:
Apabila setiap teras CPU menjalankan proses, memandangkan sumber setiap proses adalah bebas, tidak perlu mempertimbangkan konteks semasa bertukar antara teras CPU
Apabila setiap teras CPU menjalankan benang, kadangkala benang perlu berkongsi sumber, jadi sumber ini mesti disalin dari satu teras CPU ke teras yang lain, yang akan menyebabkan overhed tambahan
Ikat proses untuk berjalan pada teras cpu
Semak berapa banyak teras CPU ada
Gunakan cat /proc/cpuinfo untuk melihat maklumat cpu, dua maklumat berikut:
pemproses, nyatakan pemproses CPU yang mana
teras cpu, nyatakan bilangan teras setiap pemproses
Anda juga boleh menggunakan panggilan sistem sysconf untuk mendapatkan bilangan teras cpu:
#include int sysconf(_SC_NPROCESSORS_CONF);/* 返回系统可以使用的核数,但是其值会包括系统中禁用的核的数目,因 此该值并不代表当前系统中可用的核数 */ int sysconf(_SC_NPROCESSORS_ONLN);/* 返回值真正的代表了系统当前可用的核数 */ /* 以下两个函数与上述类似 */ #include int get_nprocs_conf (void);/* 可用核数 */ int get_nprocs (void);/* 真正的反映了当前可用核数 */
Saya menggunakan mesin maya dengan 2 pemproses Setiap pemproses hanya mempunyai satu teras, yang bersamaan dengan dua teras pada satu pemproses.
Gunakan arahan set tugas
Dapatkan pid proses
-> % ps PID TTY TIME CMD 2683 pts/1 00:00:00 zsh 2726 pts/1 00:00:00 dgram_servr 2930 pts/1 00:00:00 ps
Semak CPU yang mana proses sedang dijalankan
-> % taskset -p 2726 pid 2726's current affinity mask: 3
Nombor perpuluhan 3 yang dipaparkan ditukar kepada binari dan dua yang paling rendah ialah 1. Setiap 1 sepadan dengan CPU, jadi proses berjalan pada 2 CPU.
Proses yang dinyatakan berjalan pada cpu1
-> % taskset -pc 1 2726 pid 2726's current affinity list: 0,1 pid 2726's new affinity list: 1
Perhatikan bahawa nombor cpu bermula dari 0, jadi cpu1 mewakili cpu kedua (nombor cpu pertama ialah 0).
Pada ketika ini, aplikasi terikat kepada cpu1 untuk dijalankan, seperti yang ditunjukkan di bawah:
-> % taskset -p 2726 pid 2726's current affinity mask: 2
Ikat cpu semasa memulakan program
#启动时绑定到第二个cpu -> % taskset -c 1 ./dgram_servr& [1] 3011 #查看确认绑定情况 -> % taskset -p 3011 pid 3011's current affinity mask: 2
Gunakan panggilan sistem sched_setaffinity
sched_setaffinity boleh mengikat proses kepada CPU tertentu.
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include /* 设置进程号为pid的进程运行在mask所设定的CPU上 * 第二个参数cpusetsize是mask所指定的数的长度 * 通常设定为sizeof(cpu_set_t) * 如果pid的值为0,则表示指定的是当前进程 */ int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask); int sched_getaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);/* 获得pid所指示的进程的CPU位掩码,并将该掩码返回到mask所指向的结构中 */
Contoh
#include #include #include #include #include #define __USE_GNU #include #include #include #include #define THREAD_MAX_NUM 200 //1个CPU内的最多进程数 int num=0; //cpu中核数 void* threadFun(void* arg) //arg 传递线程标号(自己定义) { cpu_set_t mask; //CPU核的集合 cpu_set_t get; //获取在集合中的CPU int *a = (int *)arg; int i; printf("the thread is:%d\n",*a); //显示是第几个线程 CPU_ZERO(&mask); //置空 CPU_SET(*a,&mask); //设置亲和力值 if (sched_setaffinity(0, sizeof(mask), &mask) == -1)//设置线程CPU亲和力 { printf("warning: could not set CPU affinity, continuing...\n"); } CPU_ZERO(&get); if (sched_getaffinity(0, sizeof(get), &get) == -1)//获取线程CPU亲和力 { printf("warning: cound not get thread affinity, continuing...\n"); } for (i = 0; i if (CPU_ISSET(i, &get))//判断线程与哪个CPU有亲和力 { printf("this thread %d is running processor : %d\n", i,i); } } return NULL; } int main(int argc, char* argv[]) { int tid[THREAD_MAX_NUM]; int i; pthread_t thread[THREAD_MAX_NUM]; num = sysconf(_SC_NPROCESSORS_CONF); //获取核数 if (num > THREAD_MAX_NUM) { printf("num of cores[%d] is bigger than THREAD_MAX_NUM[%d]!\n", num, THREAD_MAX_NUM); return -1; } printf("system has %i processor(s). \n", num); for(i=0;ifor(i=0; ireturn 0; }
Larikan hasil
-> % ./a.out system has 2 processor(s). the thread is:0 the thread is:1 this thread 0 is running processor : 0 this thread 1 is running processor : 1
Ikat benang untuk dijalankan pada teras cpu
Ikat benang ke teras cpu menggunakan fungsi pthread_setaffinity_np Prototaipnya ditakrifkan seperti berikut:
#define _GNU_SOURCE /* See feature_test_macros(7) */ #include int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize, const cpu_set_t *cpuset); int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset); Compile and link with -pthread.
Maksud setiap parameter adalah serupa dengan sched_setaffinity.
Contoh
#define _GNU_SOURCE #include #include #include #include #define handle_error_en(en, msg) \ do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0) int main(int argc, char *argv[]) { int s, j; cpu_set_t cpuset; pthread_t thread; thread = pthread_self(); /* Set affinity mask to include CPUs 0 to 7 */ CPU_ZERO(&cpuset); for (j = 0; j if (s != 0) handle_error_en(s, "pthread_setaffinity_np"); /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(thread, sizeof(cpu_set_t), &cpuset); if (s != 0) handle_error_en(s, "pthread_getaffinity_np"); printf("Set returned by pthread_getaffinity_np() contained:\n"); for (j = 0; j if (CPU_ISSET(j, &cpuset)) printf(" CPU %d\n", j); exit(EXIT_SUCCESS); }
Larikan hasil
-> % ./a.out Set returned by pthread_getaffinity_np() contained: CPU 0 CPU 1
Melalui pengenalan artikel ini, kami telah mempelajari cara menggunakan teknologi pengikatan CPU untuk mengikat proses ke teras CPU tertentu, dengan itu meningkatkan kecekapan pelaksanaan proses dengan ketara. Dalam aplikasi sebenar, kita boleh memilih penyelesaian pengikatan CPU yang sesuai mengikut senario yang berbeza dan keperluan untuk mencapai kesan peningkatan prestasi terbaik. Saya harap artikel ini dapat membantu pembaca lebih memahami dan menggunakan teknologi pengikatan CPU, dan mencapai kecekapan kerja yang lebih tinggi dalam penggunaan sistem Linux.
Atas ialah kandungan terperinci Pembunuh CPU dwi-teras menjadikan proses Linux anda berjalan lebih pantas!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!