Rumah > Tutorial sistem > LINUX > teks badan

Pembunuh CPU dwi-teras menjadikan proses Linux anda berjalan lebih pantas!

WBOY
Lepaskan: 2024-02-14 11:50:13
ke hadapan
1131 orang telah melayarinya

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.

Pembunuh CPU dwi-teras menjadikan proses Linux anda berjalan lebih pantas!

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:

  1. Pembangunan selari dan reka bentuk program
  2. Pergantungan masa pelbagai proses
  3. Peruntukan tugas dan penjadualan
  4. Perkongsian ralat dicache
  5. Isu akses yang konsisten
  6. Komunikasi antara proses
  7. Persaingan untuk sumber dalam teras berbilang pemproses

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);/* 真正的反映了当前可用核数 */
Salin selepas log masuk

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
Salin selepas log masuk

Semak CPU yang mana proses sedang dijalankan

-> % taskset -p 2726
pid 2726's current affinity mask: 3
Salin selepas log masuk

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
Salin selepas log masuk

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
Salin selepas log masuk

Ikat cpu semasa memulakan program

#启动时绑定到第二个cpu
-> % taskset -c 1 ./dgram_servr&
[1] 3011

#查看确认绑定情况
-> % taskset -p 3011
pid 3011's current affinity mask: 2
Salin selepas log masuk

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所指向的结构中 */
Salin selepas log masuk

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;
}
Salin selepas log masuk

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
Salin selepas log masuk

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.
Salin selepas log masuk

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);
}
Salin selepas log masuk

Larikan hasil

-> % ./a.out
Set returned by pthread_getaffinity_np() contained:
CPU 0
CPU 1
Salin selepas log masuk

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!

sumber:lxlinux.net
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan