Cách đặt shmall, shmmax, shmmin, v.v ... Nói chung và cho postgresql


11

Tôi đã sử dụng tài liệu từ PostgreSQL để đặt nó ví dụ cấu hình này:

>>> cat /proc/meminfo 
MemTotal:       16345480 kB
MemFree:         1770128 kB
Buffers:          382184 kB
Cached:         10432632 kB
SwapCached:            0 kB
Active:          9228324 kB
Inactive:        4621264 kB
Active(anon):    7019996 kB
Inactive(anon):   548528 kB
Active(file):    2208328 kB
Inactive(file):  4072736 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:              3432 kB
Writeback:             0 kB
AnonPages:       3034588 kB
Mapped:          4243720 kB
Shmem:           4533752 kB
Slab:             481728 kB
SReclaimable:     440712 kB
SUnreclaim:        41016 kB
KernelStack:        1776 kB
PageTables:        39208 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     8172740 kB
Committed_AS:   14935216 kB
VmallocTotal:   34359738367 kB
VmallocUsed:      399340 kB
VmallocChunk:   34359334908 kB
HardwareCorrupted:     0 kB
AnonHugePages:    456704 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       12288 kB
DirectMap2M:    16680960 kB

>>> ipcs -l          

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 4316816
max total shared memory (kbytes) = 4316816
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767

------ Messages Limits --------
max queues system wide = 31918
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

trích xuất sysctl.conf , được tính bởi tôi:

kernel.shmall = 1079204
kernel.shmmax = 4420419584

postgresql.conf không mặc định , được tính bởi tôi:

max_connections = 60            # (change requires restart)
shared_buffers = 4GB            # min 128kB
work_mem = 4MB              # min 64kB
wal_sync_method = open_sync     # the default is the first option
checkpoint_segments = 16        # in logfile segments, min 1, 16MB each
checkpoint_completion_target = 0.9  # checkpoint target duration, 0.0 - 1.0
effective_cache_size = 6GB

Điều này có phù hợp không? Nếu không (hoặc không nhất thiết), trong trường hợp nào nó sẽ phù hợp?

Chúng tôi đã lưu ý cải tiến hiệu suất tốt với cấu hình này, bạn sẽ cải thiện nó như thế nào?

Làm thế nào để tính toán các tham số quản lý bộ nhớ kernel?

Bất cứ ai có thể giải thích làm thế nào để thực sự thiết lập chúng từ đầu?


Đó là rất nhiều câu hỏi và bạn chưa cho chúng tôi biết vấn đề hiện tại của bạn là gì (nếu có) hay mô hình sử dụng của bạn là gì. Có thể đáng để có được một cuốn sách về hiệu suất PostgreSQL.
hmallett

Vấn đề của tôi là tôi không tin rằng tôi đã cài đặt đúng. Tôi nghĩ rằng các tùy chọn quản lý bộ nhớ kernel không phải là PostgreQuery cụ thể. Tôi cũng không chắc chắn rằng PostgreSQL là nơi tốt nhất để nói về các tùy chọn này. Chắc chắn, chúng được đề cập rất nhiều trong bất kỳ bài viết nào về hiệu suất của PostgreSQL, nhưng đó là các tùy chọn Linux và tôi mong muốn thực sự hiểu cách điều chỉnh chúng nói chung.
jpic

Câu trả lời:


11

Tôi đã trả lời điều này cho một câu hỏi khác ở đây:

Git không ấn với lỗi 'hết bộ nhớ'

Tôi không trả lời tất cả các câu hỏi của bạn ở đây, nhưng câu hỏi trong tiêu đề của bạn:

Cách đặt shmall, shmmax, shmmni, v.v ... Nói chung và cho postgresql

Với một số bản phân phối kernel, có các cài đặt ngăn kernel phân bổ bộ nhớ tối đa cho một quy trình:

Đặt tham số hạt nhân

Sửa đổi /etc/sysctl.conftệp để bao gồm các dòng phù hợp với hệ điều hành của bạn:

# Red Hat Enterprise Linux 3.0 and CentOS 3.x 
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmin = 1
kernel.shmseg = 10

# semaphores: 
semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128
fs.file-max = 65536

# Red Hat Enterprise Linux 4.0 and CentOS 4.x 
kernel.shmmax = 536870912
kernel.shmmni = 4096
kernel.shmall = 2097152

Nếu quy trình của bạn vượt quá giới hạn, kernel sẽ giết tiến trình mặc dù bộ nhớ tối đa được báo cáo là có sẵn trên hệ thống của bạn.

Lưu ý: hãy cẩn thận với các cài đặt này. Bạn có thể không muốn sử dụng các cài đặt trong ví dụ đó khi tôi kéo chúng từ máy chủ trong môi trường của chúng tôi.

Một vài lưu ý thêm cần đề cập:

Để cập nhật và kiểm tra cài đặt kernel bằng sysctl, hãy sử dụng các lệnh sau:

Liệt kê các cài đặt hiện tại:

sysctl -A | grep shm
sysctl -w kernel.shmmax=<value> to write in sysctl.conf
sysctl -p /etc/sysctl.conf to read/reload the values from sysctl.conf

Vô hiệu hóa linux an toàn bằng cách chỉnh sửa /etc/selinux/configtệp, đảm bảo cờ SELINUX được đặt như sau.

SELINUX=disabled

Điều này có phù hợp không? Nếu không (hoặc không nhất thiết), trong trường hợp nào nó sẽ phù hợp?

Các cài đặt kernel thường được xác định chặt chẽ hơn trong môi trường trung tâm dữ liệu khi các nhà cung cấp ISP không muốn một quy trình khách hàng duy nhất ăn cắp tất cả các tài nguyên trên một máy chủ dùng chung.

Bạn thường không phải thiết lập các tham số bộ nhớ kernel trừ khi bạn có một quá trình bị kernel giết chết do thiếu tài nguyên.

Trong một số trường hợp, postgres cũng có thể phân bổ nhiều mem cho kích thước trang cụ thể hơn những gì có sẵn trong mememory chia sẻ:

* The PostgreSQL server failed to start. Please check the log output:
2011-11-04 05:06:26 UTC FATAL: could not create shared memory segment: Invalid
argument
2011-11-04 05:06:26 UTC DETAIL: Failed system call was shmget(key=5432001, size
=161849344, 03600).
2011-11-04 05:06:26 UTC HINT: This error usually means that PostgreSQL’s reques
t for a shared memory segment exceeded your kernel’s SHMMAX parameter. You can
either reduce the request size or reconfigure the kernel with larger SHMMAX. To
reduce the request size (currently 161849344 bytes), reduce PostgreSQL’s shared
_buffers parameter (currently 19200) and/or its max_connections parameter (curre
ntly 53).
If the request size is already small, it’s possible that it is less than
your kernel’s SHMMIN parameter, in which case raising the request size or recon
figuring SHMMIN is called for.
The PostgreSQL documentation contains more information about shared memo
ry configuration.
…fail!

Các lỗi như ví dụ trên, có thể được giải quyết bằng cách điều chỉnh cài đặt tài nguyên kernel của bạn. Các cài đặt và phương thức được đề xuất, để xác định cài đặt tài nguyên, được mô tả chi tiết tại đây:

http://www.postgresql.org/docs/9.1/static/kernel-resource.html

Tuy nhiên, bạn thực sự không phải chạm vào các cài đặt này trừ khi bạn gặp phải tình huống chết đói tài nguyên liên quan đến quá trình xử lý hậu kỳ. Những tình huống này xảy ra, thường xuyên nhất, trong môi trường dùng chung hoặc máy chủ có ít tài nguyên được phân bổ cho chúng.

Bất cứ ai có thể giải thích làm thế nào để thực sự thiết lập chúng từ đầu?

Đối với điều chỉnh Postgres, bạn nên đọc điều này:

http://wiki.postgresql.org/wiki/Tuning_Your_PostgreQuery_Server


1
"Lưu ý: hãy cẩn thận với các cài đặt này. Có lẽ bạn không muốn sử dụng các cài đặt trong ví dụ đó khi tôi kéo chúng từ máy chủ trong môi trường của chúng tôi." Làm thế nào tôi nên tính toán chúng cho môi trường của tôi?
jpic

1
Xin chào jpic, tôi đã cập nhật để cung cấp thêm chi tiết về cài đặt kernel.
Jason Huntley

2

Oh!! Tôi tìm thấy một công cụ tuyệt vời để tính toán cấu hình mem tối ưu của máy chủ postgresql của chúng tôi ở đây.

http://pgtune.leopard.in.ua/


Công cụ này không phải là để tính toán cấu hình Optimus, nó cung cấp cho bạn một điểm khởi đầu để điều chỉnh máy chủ của bạn, vì nó cung cấp cho bạn câu trả lời chủ yếu dựa trên các cài đặt phần cứng của bạn. Kích thước cơ sở dữ liệu, số lượng truy vấn và kích thước cũng rất quan trọng để điều chỉnh các tham số cấu hình.
EAmez

1

Các cấu hình kernel đó là toàn cục, không phải là quy trình cụ thể, vì vậy rất phù hợp để đặt chúng vào sysctl.conf.


Câu hỏi là về việc xác định các giá trị cho các tham số quản lý bộ nhớ chia sẻ kernel, "làm thế nào", không phải là "ở đâu" ... Cảm ơn vì nỗ lực đưa vào câu trả lời của bạn.
jpic

Vâng. có đâu là tầm thường. thịt của nó thế nào
Henley Chiu

0

Vâng, nó phụ thuộc vào những gì khác đang chạy trên máy chủ, nếu đây là một máy chủ PostgreQuery thuần túy thì PostgreQuery là nơi thích hợp để tìm kiếm các cài đặt này.
Nếu bạn đang chạy các ứng dụng / dịch vụ khác có nhu cầu bộ nhớ cụ thể thì bạn sẽ cần tìm một cài đặt tối ưu giữa các ứng dụng khác nhau này.

Nếu bạn đang thấy hiệu suất tăng trên cơ sở dữ liệu và không làm giảm hiệu suất trên các ứng dụng khác thì tôi sẽ không lo lắng về điều này.

Nói chung, cơ sở dữ liệu nhạy cảm nhất với cài đặt bộ nhớ, vì rất có thể chúng là nút cổ chai về hiệu năng ứng dụng, nên tối ưu hóa hệ thống của bạn cho DB.


Làm thế nào "để tìm một cài đặt tối ưu giữa các ứng dụng khác nhau"? Tôi không gặp vấn đề về hiệu năng, tôi đang tìm cách chuẩn để định cấu hình cài đặt kernel bộ nhớ dùng chung, làm thế nào một pro thực sự sẽ làm điều đó? Giả sử ai đó xử lý cho bạn một máy chủ đang chạy với một số dịch vụ và trả tiền cho bạn để chỉ thiết lập quản lý bộ nhớ, bạn sẽ làm gì?
jpic

Không có quy tắc vàng, bạn chỉ cần nhìn những gì nhà cung cấp nói và kiểm tra nó. Nếu bạn có nhiều ứng dụng chạy trên cùng một máy, hãy cố gắng tối ưu hóa cho ứng dụng cần nhiều bộ nhớ nhất, trong hầu hết các trường hợp là DB. Nhưng bên cạnh việc xem xét các đề xuất của nhà cung cấp, hãy thử nghiệm chúng, không có giải pháp đúng duy nhất
Sibster

Tôi biết không có quy tắc vàng. Tôi hy vọng có thể tiền thưởng sẽ thúc đẩy một người thực sự hiểu đầy đủ điều này để viết một số hướng. Nhưng tôi nghĩ rằng không ai thực sự hiểu điều này sau tất cả - vì không ai có thể đưa ra một lời giải thích đơn giản.
jpic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.