Rumah Operasi dan penyelenggaraan Nginx Bagaimana untuk mengkonfigurasi permulaan kumpulan memori asas dalam Nginx

Bagaimana untuk mengkonfigurasi permulaan kumpulan memori asas dalam Nginx

May 18, 2023 pm 12:01 PM
nginx

ngx_cycle 的初始化
整个初始化过程中,最重要的就是全局变量 nginx_cycle 的初始化,很多变量都是在这个过程中初始化的

nginx_cycle 又是通过两个局部变量 init_cycle 和 cycle 实现初始化的

事实上,日志初始化也可以算是对 nginx_cyle 的初始化,因为在代码中接下来马上要发生的就是一个赋值

ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));
init_cycle.log = log;
ngx_cycle = &init_cycle;

// 创建内存池 1kb
init_cycle.pool = ngx_create_pool(1024, log);
if (init_cycle.pool == null) {
 return 1;
}

// 保存调用参数到全局变量,init_cycle 只用于提供 log 参数
if (ngx_save_argv(&init_cycle, argc, argv) != ngx_ok) {
 return 1;
}

// 保存配置文件路径、程序运行路径、调用参数到 init_cycle
if (ngx_process_options(&init_cycle) != ngx_ok) {
 return 1;
}

// 获取操作系统信息、cpu信息、最大连接数、是否支持非阻塞连接等
if (ngx_os_init(log) != ngx_ok) {
 return 1;
}

/*
 * ngx_crc32_table_init() requires ngx_cacheline_size set in ngx_os_init()
 */

// 对齐校验表
if (ngx_crc32_table_init() != ngx_ok) {
 return 1;
}

// 获取所有继承连接fd的相关信息
if (ngx_add_inherited_sockets(&init_cycle) != ngx_ok) {
 return 1;
}
Salin selepas log masuk

内存池
nginx 是通过资源集中管理的方式管理资源的,即打开所有即将要用的资源,以备随时取用,无论是文件还是内存

这样做的好处是避免了每次创建、打开资源造成的性能消耗

因此,便有了内存池模块,用来集中申请内存资源并进行内存资源的管理和分配

内存池结构:

// struct ngx_pool_data_t
// 内存池数据块结构 {{{
typedef struct {
 u_char    *last;  // 当前内存分配的结束位置
 u_char    *end;  // 内存池的结束位置
 ngx_pool_t   *next;  // 下一内存池
 ngx_uint_t   failed; // 内存分配失败计数
} ngx_pool_data_t; // }}}
// struct ngx_pool_s
// 内存池结构 {{{
struct ngx_pool_s {
 ngx_pool_data_t  d;  // 内存池数据块
 size_t    max;  // 待分配内存大小
 ngx_pool_t   *current; // 指向当前内存池起始位置
 ngx_chain_t   *chain;
 ngx_pool_large_t  *large; // 指向大块内存分配
 ngx_pool_cleanup_t *cleanup; // 析构函数
 ngx_log_t   *log;  // 内存分配相关的log
}; // }}}
Salin selepas log masuk

在这个函数中,使用了一个封装好的函数 ngx_memalign,这个函数是对系统中按照数据对齐方式分配内存的函数的封装,在不同的系统中实现方式不同,通过宏定义,实现了操作系统的适配,这是一个很漂亮的技巧

#if (ngx_have_posix_memalign)
// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
// 用数据对齐的方式进行内存分配 {{{
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
{
 void *p;
 int err;
 // size 单位是 byte 而不是 bit
 err = posix_memalign(&p, alignment, size);
 if (err) {
  ngx_log_error(ngx_log_emerg, log, err,
      "posix_memalign(%uz, %uz) failed", alignment, size);
  p = null;
 }
 ngx_log_debug3(ngx_log_debug_alloc, log, 0,
     "posix_memalign: %p:%uz @%uz", p, size, alignment);
 return p;
} // }}}
#elif (ngx_have_memalign)
// void * ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
// 用数据对齐的方式进行内存分配 {{{
void *
ngx_memalign(size_t alignment, size_t size, ngx_log_t *log)
Salin selepas log masuk

所有有关内存分配的系统调用函数的封装都定义在 ngx_alloc.c 文件中

这里用到了 posix_memalign 系统调用,使用这个系统调用分配出来的内存是默认按照第二个参数的大小对齐的,这样在进行数据读写的时候,cpu可以周期地对整块数据进行读写,很大程度的节省了cpu时间

这个系统调用所分配的内存也是存在于堆内存中的,可以使用 free 函数进行释放,不过 malloc 分配的内存默认也是对齐的,它相对于 malloc 的优势仅仅在于可以指定默认对齐大小。
函数完成了内存池的初步分配,执行后 pool 取值:

$23 = (ngx_pool_t *) 0x80fe9f0
(gdb) p *init_cycle.pool
$24 = {
 d = {
 last = 0x80fea18, 
 end = 0x80fedf0, 
 next = 0x0, 
 failed = 0
 }, 
 max = 984, 
 current = 0x80fe9f0, 
 chain = 0x0, 
 large = 0x0, 
 cleanup = 0x0, 
 log = 0x80e3020 <ngx_log>
}
Salin selepas log masuk

如下图所示:

Bagaimana untuk mengkonfigurasi permulaan kumpulan memori asas dalam Nginx

Atas ialah kandungan terperinci Bagaimana untuk mengkonfigurasi permulaan kumpulan memori asas dalam Nginx. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara memeriksa sama ada nginx dimulakan Cara memeriksa sama ada nginx dimulakan Apr 14, 2025 pm 01:03 PM

Bagaimana untuk mengesahkan sama ada nginx dimulakan: 1. Gunakan baris arahan: status sistem sistem nginx (linux/unix), netstat -ano | Findstr 80 (Windows); 2. Periksa sama ada port 80 dibuka; 3. Semak mesej permulaan Nginx dalam log sistem; 4. Gunakan alat pihak ketiga, seperti Nagios, Zabbix, dan Icinga.

Cara mengkonfigurasi nama domain pelayan awan di nginx Cara mengkonfigurasi nama domain pelayan awan di nginx Apr 14, 2025 pm 12:18 PM

Cara mengkonfigurasi nama domain Nginx pada pelayan awan: Buat rekod yang menunjuk ke alamat IP awam pelayan awan. Tambah blok hos maya dalam fail konfigurasi Nginx, menyatakan port pendengaran, nama domain, dan direktori akar laman web. Mulakan semula nginx untuk memohon perubahan. Akses konfigurasi ujian nama domain. Nota Lain: Pasang sijil SSL untuk membolehkan HTTPS, pastikan firewall membenarkan trafik port 80, dan tunggu resolusi DNS berkuatkuasa.

Cara memulakan nginx di linux Cara memulakan nginx di linux Apr 14, 2025 pm 12:51 PM

Langkah -langkah untuk memulakan Nginx di Linux: Periksa sama ada Nginx dipasang. Gunakan SistemCTL Mula Nginx untuk memulakan perkhidmatan Nginx. Gunakan SistemCTL Dayakan NGINX untuk membolehkan permulaan automatik Nginx pada permulaan sistem. Gunakan Status SistemCTL Nginx untuk mengesahkan bahawa permulaan berjaya. Lawati http: // localhost dalam pelayar web untuk melihat halaman selamat datang lalai.

Cara memulakan pelayan nginx Cara memulakan pelayan nginx Apr 14, 2025 pm 12:27 PM

Memulakan pelayan Nginx memerlukan langkah-langkah yang berbeza mengikut sistem operasi yang berbeza: Sistem Linux/Unix: Pasang pakej Nginx (contohnya, menggunakan apt-get atau yum). Gunakan SystemCTL untuk memulakan perkhidmatan Nginx (contohnya, SUDO SystemCTL Mula Nginx). Sistem Windows: Muat turun dan pasang fail binari Windows. Mula Nginx menggunakan nginx.exe executable (contohnya, nginx.exe -c conf \ nginx.conf). Tidak kira sistem operasi yang anda gunakan, anda boleh mengakses IP pelayan

Bagaimana untuk memeriksa sama ada Nginx dimulakan? Bagaimana untuk memeriksa sama ada Nginx dimulakan? Apr 14, 2025 pm 12:48 PM

Di Linux, gunakan arahan berikut untuk memeriksa sama ada nginx dimulakan: Hakim status SistemCTL Nginx berdasarkan output arahan: Jika "Aktif: Aktif (Running)" dipaparkan, Nginx dimulakan. Jika "aktif: tidak aktif (mati)" dipaparkan, nginx dihentikan.

Cara Mengkonfigurasi Nginx di Windows Cara Mengkonfigurasi Nginx di Windows Apr 14, 2025 pm 12:57 PM

Bagaimana cara mengkonfigurasi nginx di Windows? Pasang Nginx dan buat konfigurasi hos maya. Ubah suai fail konfigurasi utama dan sertakan konfigurasi hos maya. Mulakan atau Muat semula Nginx. Uji konfigurasi dan lihat laman web. Selektif membolehkan SSL dan mengkonfigurasi sijil SSL. Selektif tetapkan firewall untuk membolehkan trafik port 80 dan 443.

Cara menyelesaikan nginx403 Cara menyelesaikan nginx403 Apr 14, 2025 am 10:33 AM

Bagaimana untuk memperbaiki kesilapan dilarang nginx 403? Semak keizinan fail atau direktori; 2. Semak .htaccess File; 3. Semak fail konfigurasi nginx; 4. Mulakan semula nginx. Penyebab lain yang mungkin termasuk peraturan firewall, tetapan selinux, atau isu aplikasi.

Cara menyelesaikan masalah domain nginx Cara menyelesaikan masalah domain nginx Apr 14, 2025 am 10:15 AM

Terdapat dua cara untuk menyelesaikan masalah silang domain Nginx: Ubah suai tajuk tindak balas silang domain: Tambah arahan untuk membenarkan permintaan lintas domain, nyatakan kaedah dan tajuk yang dibenarkan, dan tetapkan masa cache. Gunakan modul CORS: Dayakan modul dan konfigurasikan peraturan CORS untuk membolehkan permintaan, kaedah, tajuk, dan masa cache domain.

See all articles