Nginx中的进程亲和性 affinity

Nginx采用多进程Master/Worker结构,Worker进程数为CPU个数时工作效率最高,Nginx通过affinity为每个Worker进程绑定一个CPU,避免进程切换带来的消耗,同时能够保证缓存命中率。

Nginx配置文件conf/nginx.conf中关于Worker进程个数,和affinity的配置命令:

worker_processes  4;
worker_cpu_affinity 1000 0100 0010 0001;

应用程序可以主动调用接口设定:

Linux进程:

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);

例子:

 1 #define _GNU_SOURCE
 2
 3 #include <sched.h>
 4 #include <unistd.h>
 5
 6 void do_something(void);
 7
 8 int
 9 main(void)
10 {
11     pid_t pid;
12     cpu_set_t mask;
13
14     if((pid = fork()) == 0){
15         do_something();
16     }
17     CPU_ZERO(&mask);
18     CPU_SET(0,&mask);
19     sched_setaffinity(pid,sizeof(cpu_set_t),&mask);
20
21     if((pid = fork()) == 0){
22         do_something();
23     }
24     CPU_ZERO(&mask);
25     CPU_SET(1,&mask);
26     sched_setaffinity(pid,sizeof(cpu_set_t),&mask);
27
28     wait();
29     wait();
30 }
31
32 void
33 do_something(void)
34 {
35     int i;
36     while(1){
37         i = 1;
38     }
39 }

sched_setaffinity

FreeBSD上可以通过调用cpuset_setaffinity设定

Nginx源码src/os/unix/nginx_setaffinity.c中实现对Linux和FreeBSD中设置亲和性的包装,根据配置文件设置Worker进程亲和性

当然,POSIX线程也可以设置亲和性:

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);

已经运行的进程也可以通过外部命令设定:

       taskset [options] mask command [arg]...
       taskset [options] -p [mask] pid
时间: 2024-10-20 10:12:09

Nginx中的进程亲和性 affinity的相关文章

nginx中父子进程工作的主体函数

根据Nginx(0.7.67版本)的代码,对Nginx基本的进程创建,进程主体以及事件处理进行了简要的分析. 基本上,父进程(即主进程)一开始会初始化及读取配置,并加载各模块的功能,然后fork()出N个子进程(即工作进程),具有相同的工作逻辑和功能.父进程负责监听信号(如HUP,QUIT等),通过socket pair把信号传递给子进程(子进程间一般不通信).子进程通过事件来处理父进程传递的信号.因为每个子进程都共享服务监听端口(如http 80),当用户发送请求时,会触发子进程的事件调用函数

CentOS6.4 安装OpenResty和Redis 并在Nginx中利用lua简单读取Redis数据

1.下载OpenResty和Redis OpenResty下载地址:wget http://openresty.org/download/ngx_openresty-1.4.3.6.tar.gz Redis下载地址:wget http://download.redis.io/releases/redis-2.8.6.tar.gz 2.安装依赖包 yum install -y gcc gcc-c++ readline-devel pcre-devel openssl-devel tcl perl

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差

Nginx 中 fastcgi_pass 监听端口 unix socket和tcp socket差别 Nginx连接fastcgi的方式有2种:unix domain socket和TCP,Unix domain socket 或者 IPC socket是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain sockets 既可以使用字节流和数据队列,而管道通信则只能通过字节流.Unix domain sockets的接口和Internet socke

nginx中有关命令和日志切割,配置文件加载的详细阐述

一.Nginx简介 Nginx ("engine x") 是俄罗斯人Igor Sysoev(塞索耶夫)编写的一款高性能的 HTTP 和反向代理服务器.Nginx 已经在俄罗斯最大的门户网站── Rambler Media(www.rambler.ru)上运行了4年时间,同时俄罗斯超过20%的虚拟主机平台采用Nginx作为反向代理服务器.在国内,已经有新 浪博客.新浪播客.搜狐通行证.网易新闻.网易博客.金山逍遥网.金山爱词霸.校内网.YUPOO相册.豆瓣.迅雷看看等多家网站.频道使用

nginx中的超时设置

参考博文: nginx中的超时设置 nginx使用proxy模块时,默认的读取超时时间是60s. 1. send_timeout syntax: send_timeout the time default: send_timeout 60 context: http, server, location Directive assigns response timeout to client. Timeout is established not on entire transfer of ans

Nginx 中处理 HTTP 请求

概述 在 Nginx 的初始化启动过程中,worker 工作进程会调用事件模块的ngx_event_process_init 方法为每个监听套接字ngx_listening_t 分配一个 ngx_connection_t 连接,并设置该连接上读事件的回调方法 handler 为 ngx_event_accept,同时将读事件挂载到epoll 事件机制中等待监听套接字连接上的可读事件发生,到此,Nginx 就可以接收并处理来自客户端的请求.当监听套接字连接上的可读事件发生时,即该连接上有来自客户端

Nginx 中 HTTP模块初始化

概述 在前面的文章< Nginx 配置解析>简单讲解了通用模块的配置项解析,并且大概讲解了HTTP 模块的配置项解析过程,本文更具体的分析 HTTP 模块的初始化过程.HTTP 模块初始化过程主要有:上下文结构初始化.配置项解析.配置项合并.server 相关端口设置. HTTP 模块接口 ngx_http_module_t 结构体 在 Nginx 中,结构体 ngx_module_t 是 Nginx 模块最基本的接口.对于每一种不同类型的模块,都有一个具体的结构体来描述这一类模块的通用接口.

nginx中时间的管理

nginx出于性能考虑采用类似lib_event的方式,自己对时间进行了cache,用来减少对gettimeofday()的调用,因为一般来说服务器对时间的精度要求不是特别的高,不过如果需要比较精确的timer,nginx还提供了一个timer_resolution指令用来设置时间精度,具体的机制再后面会做介绍.在ngx_times.c中提供了ngx_time_update()函数来更新时间缓存,另外还有一个在信号处理中用来更新cached_err_log_time的ngx_time_sigsa

Nginx中URL不区分大小写

本模块允许在Nginx中直接执行Prel,或者通过SSI调用Perl. 默认是不会编译进Nginx的,如果你要使用,则要在编译安装Nginx指定: ./configure --with-http_perl_module 另外:操作系统中必须安装:Perl5.6.1以上版本 已知问题:     1 ) 如果Perl模块执行长时间操作,例如:DNS查询.数据库查询等,运行Perl脚本的工作进程将一直处于阻塞状态,因此内置的Perl脚本应该非常简单,执行尽可能快.     2)Nginx在通过“Kil