Có tồn tại một lớp học của các ứng dụng mà bạn không bao giờ muốn họ để trao đổi . Một lớp như vậy là một cơ sở dữ liệu. Cơ sở dữ liệu sẽ sử dụng bộ nhớ như bộ nhớ cache và bộ đệm cho vùng đĩa của họ, và nó hoàn toàn không có ý nghĩa rằng những bao giờ được đưa vào trao đổi. Bộ nhớ cụ thể có thể chứa một số dữ liệu có liên quan không cần thiết trong một tuần cho đến một ngày khi khách hàng yêu cầu.Nếu không có bộ nhớ đệm/trao đổi, cơ sở dữ liệu đơn giản sẽ tìm thấy các hồ sơ có liên quan trên đĩa, mà sẽ được khá nhanh; nhưng với trao đổi, dịch vụ của bạn có thể đột nhiên mất nhiều thời gian để phản hồi.
mysqld
bao gồm mã để sử dụng cuộc gọi hệ điều hành/hệ thống memlock
. Trên Linux, kể từ ít nhất 2.6.9, cuộc gọi hệ thống này sẽ hoạt động đối với các quy trình không phải gốc có khả năng CAP_IPC_LOCK
[1]. Khi sử dụng memlock()
, quá trình vẫn phải hoạt động trong giới hạn của giới hạn LimitMEMLOCK
. [2]. Một trong số ít những điều tốt đẹp về số systemd
là bạn có thể cấp cho các quy trình mysqld
những khả năng này mà không yêu cầu một chương trình đặc biệt. Nếu bạn cũng có thể thiết lập các quảng cáo như bạn mong đợi với ulimit
. Dưới đây là một tập tin override
cho mysqld
mà không được bước cần thiết, trong đó có một vài người khác mà bạn có thể cần cho một quá trình như một cơ sở dữ liệu:
[Service]
# Prevent mysql from swapping
CapabilityBoundingSet=CAP_IPC_LOCK
# Let mysqld lock all memory to core (don't swap)
LimitMEMLOCK=-1
# do not kills this process if low on memory
OOMScoreAdjust=-900
# Use higher io scheduling
IOSchedulingClass=realtime
Type=simple
ExecStart=
ExecStart=/usr/sbin/mysqld --memlock $MYSQLD_OPTS
Note Các mysql cộng đồng tiêu chuẩn hiện tàu với Type=forking
và thêm --daemonize
trong tùy chọn dịch vụ trên đường dây ExecStart
. Điều này vốn kém ổn định hơn so với phương pháp trên.
CẬP NHẬT Tôi không hài lòng với giải pháp này 100%. Sau vài ngày trong thời gian chạy, tôi nhận thấy quá trình này vẫn có số lượng hoán đổi khổng lồ! Kiểm tra /proc/XXXX/smaps
, tôi lưu ý những điều sau:
- Đóng góp lớn nhất của hoán đổi là từ một phân đoạn ngăn xếp! 437 MB và dao động. Điều này trình bày các vấn đề hiệu suất rõ ràng. Nó cũng cho thấy rò rỉ bộ nhớ dựa trên stack.
- Có zero Trang bị khóa. Điều này cho biết tùy chọn
memlock
trong MySQL (hoặc Linux) bị hỏng. Trong trường hợp này, nó sẽ không quan trọng nhiều vì MySQL không thể ngăn chặn ngăn xếp.
Unix được sử dụng để tôn vinh "bit dính" nếu bạn đã thực hiện "chmod + S" trên một ứng dụng, nhưng tôi không nghĩ rằng nó hoạt động nữa. –
Xin lỗi, ý tôi là "chmod + t", nhưng tôi chỉ xem và Linux bỏ qua bit dính. –
http://blogs.msdn.com/b/oldnewthing/archive/2005/06/07/426294.aspx – Hello71