Khi cài đặt Oracle trên Linux, ta phải cấu hình các tham số kernel trong file /etc/sysctl.conf. Trong các tham số đó có các tham số liên quan đến cấu hình semaphore và shared memory trên Linux.

 

Shared memory

Oracle dùng shared memory segments để làm SGA. Việc cấu hình SGA chính xác hay không ảnh hưởng rất nhiều đến hoạt động của database.

 

Ta có thể kiểm tra thông tin shared memory segments trên hệ thống như sau

 

 

Có 3 tham số liên quan đến shared memory segments ta cần cấu hình.

 

 

SHMMNI quy định số shared memory segment trên hệ thống. Giá trị tối thiểu khuyên dùng là 4096.

 

 

SHMALL quy định tổng dung lượng shared memory trên hệ thống tính bằng page với page_size thường là 4096 bytes

 

 

Khi đó dung lượng shared memory tối đa  = 2097152*4096 = 8GB

 

Giá trị mặc định thông thường là 2097152. Với hệ thống có RAM lớn, ta nên set shmall sao cho tổng shared memory nhỏ hơn RAM 1 chút (để lại 1 phần cho OS và các chương trình khác v.v…), và lớn hơn hoặc bằng tổng SGA của các instance.

 

VD: hệ thống có 32GB RAM, chừa lại 4GB cho OS.

Vậy shmall = (32 – 4)*1024*1024*1024/4096 = 7340032

 

 

SHMMAX quy định kích thước tối đa có thể của 1 shared memory segment tính bằng byte. Như ví dụ trên là 512MB. 

  • Với hệ thống 32bit, SHMMAX chỉ có thể set tối đa là 4294967296 – 1 = 4294967295 bytes
  • Với hệ thống 64bit, có thể set theo 2 cách: 1/2 RAM hoặc kích thước SGA lớn nhất + 1 GB

 

VD: hệ thống 64bit có 32GB RAM, 1 instance database có SGA = 24GB

Cách 1: shmmax = 16*1024*1024*1024 = 17179869184 bytes

Cách 2: shmmax = (24 + 1)*1024*1024*1024 = 26843545600 bytes

 

Ta thường dùng cách 2 khi muốn SGA hoàn toàn nằm trong 1 memory segment.

 

Note
Oracle sử dụng lần lượt 3 cách khi khởi tạo bộ nhớ SGA

One segment: nếu shmmax >= SGA, SGA có thể được khởi tạo và nằm hoàn toàn trong 1 shared memory segment

– Contiguous multi segment: nếu SGA > shmmax, Oracle tìm các shared memory segment nằm cạnh nhau để khởi tạo SGA

– Non-contiguous multi segment: nếu SGA > shmmax và không thể tìm các shared memory segment cạnh nhau, Oracle phải tìm các shared memory segment nằm rải rác để khởi tạo SGA

 

Semaphore

Semaphore hiểu đơn giản là các bộ đếm/các biến số (counters/variables) nắm giữ trạng thái của shared resources trên hệ thống (memory, CPU…) nhằm phục vụ cho việc đồng bộ hóa tiến trình (provide synchronization between processes or between threads within a process), hay nói dễ hiểu là kiểm soát việc sử dụng resource trong môi trường multi processes.

 

Có 2 dạng semaphore: binary semaphore – chỉ hiển thị được 2 giá trị (0/1 hay locked/unlocked), hoặc counting semaphore – có thể hiển thị nhiều giá trị khác nhau.

 

Nếu counter > 0, resource đang available. Nếu counter <= 0, resoucre đang busy.

 

Ta có thể kiểm tra thông tin semaphore hiện tại trên hệ thống như sau

 

 

Các hệ thống như Red hat hỗ trợ semaphore set với mỗi một semaphore là một counting semaphore.

Số semaphore trong 1 set được quy định bởi tham số SEMMSL (giá trị đầu tiên trong chuỗi giá trị cho kernel.sem)

  • Giá trị mặc định: 250
  • Giá trị  nên dùng khi tham số processes của Oracle lớn: processes + 10

 

Số semaphore set tối đa trên hệ thống Linux được quy định bởi tham số SEMMNI (giá trị cuối cùng trong chuỗi giá trị cho kernel.sem)

  • Giá trị mặc định: 128
  • Giá trị  thường dùng: 128

 

Số semaphore tối đa trên hệ thống Linux được quy định bởi tham số SEMMNS (giá trị thứ hai trong chuỗi giá trị cho kernel.sem). 1 semaphore set có thể có 1 hoặc nhiều semaphore. Hệ thống sẽ cấp phát số semaphore theo giá trị nhỏ hơn giữa 2 giá trị SEMMNS và (SEMMSL*SEMMNI).

  • Giá trị mặc định: 32000 (= 250*128)
  • Giá trị  nên dùng: = SEMMSL*SEMMNI

 

Số semaphore operation tối đa có thể thực hiện trên 1 lần system call được quy định bởi tham số SEMOPM (giá trị thứ ba trong chuỗi giá trị cho kernel.sem). Do hệ thống có thể thao tác trên nhiều semaphore, nên đặt giá trị này bằng với số semaphore trong 1 set (= SEMMSL) 

  • Giá trị mặc định: 100
  • Giá trị  nên dùng: = SEMMSL

VD:

– Oracle database ta cấu hình 5000 processes

– SEMMSL = 5000 + 10 = 5010

– SEMMNI = 128

– SEMMNS = 5010*128 = 641280

– SEMOPM = 5010

 

Ta có thể set giá trị vào file sysctl.conf như sau

 

 

Trong thực tế, việc tính toán cấu hình shared memory quan trọng hơn nhiều khi ảnh hưởng trực tiếp đến SGA. Semaphore ta có thể sử dụng giá trị mặc định “250 32000 100 128” cho đa số các hệ thống. Chỉ có những hệ thống có lượng kết nối rất lớn ta mới cần tính toán lại semaphore.