Giới hạn mô tả tập tin Ulimit không được áp dụng cho quy trình cụ thể


14

Gần đây tôi đã kiểm tra một trong các quy trình redis của chúng tôi về những điều đáng lo ngại khi áp dụng:

cat /proc/<redis-pid>/limits

Và đã ngạc nhiên khi biết rằng đó là giá trị mặc định thấp:

Limit                     Soft Limit           Hard Limit           
Max open files            4016                 4016 

Tôi đã ngạc nhiên, bởi vì chúng tôi có cấu hình sau:

# /etc/sysctl.conf 
fs.file-max = 100000

.

# /etc/security/limits.conf
* soft nofile 100000
* hard nofile 100000

.

# /etc/ssh/sshd_config
UsePAM yes

.

# /etc/pam.d/sshd
session required pam_limits.so

Bất cứ ai có thể cho tôi biết tại sao ulimit tăng không được áp dụng cho quá trình redis đang chạy?

Quá trình redis đang chạy khi người dùng 'redis', máy chủ đã được khởi động lại do các giới hạn được tăng lên. Chúng tôi đang trên Debian Bóp.

Câu trả lời:


19

Trong giới hạn tài nguyên Linux có thể được đặt ở nhiều vị trí khác nhau dựa trên loại yêu cầu.

  1. /etc/security/limits.conf tập tin.
  2. /etc/sysctl.conf tập tin.
  3. ulimit chỉ huy

/etc/security/limits.conflà một phần của pam_limits và do đó, các giới hạn được đặt trong tệp này được đọc bởi mô-đun pam_limits trong các phiên đăng nhập. Phiên đăng nhập có thể bằng sshhoặc thông qua terminal. Và pam_limits sẽ không ảnh hưởng đến các quy trình trình nền như được đề cập ở đây .

/etc/sysctl.conflà một cấu hình toàn cầu trên toàn hệ thống, chúng tôi không thể đặt cấu hình cụ thể cho người dùng ở đây. Nó đặt lượng tài nguyên tối đa có thể được sử dụng bởi tất cả người dùng / quy trình đưa vào.

ulimitlệnh được sử dụng để đặt giới hạn của shell. Và do đó, khi một giới hạn được đặt ulimittrên một vỏ, quá trình được sinh ra từ vỏ đó cũng nhận được giá trị đó vì quy tắc mà child processcác parent processesthuộc tính kế thừa .

Và vì vậy, đối với trường hợp của bạn, vì redisnó được bắt đầu như là một phần của initnhững điều trên sẽ không giúp bạn trực tiếp. Cách thích hợp để làm điều này là, bạn phải sử dụng ulimitlệnh để đặt giá trị mới trong chính tập lệnh init. Giống như bên dưới trong kịch bản,

ulimit -n 100000
if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS.

Đã có một lỗi được gửi trong danh sách mong muốn để thêm ulimittính năng start-stop-daemon .

Ngoài ra kiểm tra rediscấu hình nếu có bất kỳ cách cung cấp giới hạn ở đó.


Tóm tắt tuyệt vời Kannan! Bây giờ tôi đã đi trước và thêm ulimit vào kịch bản khởi động. Thật đáng tiếc, không có cách nào chỉ đặt giới hạn cho người dùng sẽ làm việc với các quy trình khử từ (vì chúng tôi có nhiều tập lệnh khởi động), nhưng điều này hoạt động. Cảm ơn bạn!
UpTheCux

Câu trả lời chính xác. Quá trình con kế thừa các thuộc tính của tiến trình cha là điều làm tôi ngạc nhiên, tất cả các giới hạn đều đúng đối với người dùng đang chạy tiến trình con nhưng đó là giới hạn từ chủ sở hữu của tiến trình cha mẹ đang được sử dụng.
đồng bộ hóa

2

Tham số sysctl fs.file-max là giới hạn hệ thống toàn cầu rộng, tôi không nghĩ là một thiết lập ý tưởng tốt trong ulimit cùng giá trị.

Nếu bạn đặt trong ulimit 100000 và trong sysctl.conf 100000 nữa, một người dùng có thể chặn hệ thống

Dù sao đi nữa, nói về vấn đề của bạn, bạn chắc chắn, hệ thống của bạn sử dụng pam_limits

man pam_limits
grep -i limit /etc/pam.d/*

Cảm ơn - Tôi sẽ xem xét tăng giá trị fs.file-max sau đó. Về pam - Tôi tin rằng chúng tôi đang sử dụng điều này (Tôi đã thêm một số cấu hình bổ sung cho câu hỏi). Tôi không thực sự chắc chắn rằng tôi hiểu PAM, vì các cài đặt của chúng tôi dường như có liên quan đến SSH, không được người dùng này sử dụng. Có tập tin nào khác tôi cần cấu hình không? Tôi luôn có thể đặt một thiết lập ulimit trong các tập lệnh init cho redis, nhưng thà không phải làm điều này.
UpTheCux

2

Bạn đã kích hoạt pam_limits cho sshd, nhưng lệnh này có được thực thi từ phiên SSH không? Bạn có thể cần thêm cùng một dòng vào /etc/pam.d/loginvà / hoặc /etc/pam.d/suvà / hoặc /etc/pam.d/sudo.


Cảm ơn. Tôi nghi ngờ điều đó không hoàn toàn đúng. Quá trình đang được bắt đầu dòng này trong một tập lệnh init.d : if start-stop-daemon --start --quiet --umask 007 --pidfile $PIDFILE --chuid redis:redis --exec $DAEMON -- $DAEMON_ARGS. Mà pam sẽ thích hợp trong trường hợp này?
UpTheCux

trong tập lệnh của bạn, bạn có thể sử dụng ulimit -n 100000
c4f4t0r

Tập lệnh init.d có sử dụng su [user] -clệnh để khởi động tập lệnh với tư cách người dùng khác không, hoặc chương trình của bạn có chạy bằng root không? Nếu nó đang sử dụng su, thì bạn sẽ đặt nó vào /etc/pam.d/su. Nếu bạn đang chạy như vậy root, có lẽ bạn sẽ tốt hơn với đề xuất thêm ulimitlệnh của c4f4t0r trong tập lệnh init của bạn. rootđược phép đặt bất kỳ giới hạn nào nó muốn, vì vậy bạn không thực sự cần phải lo lắng về vấn đề này.
Toàn năng

1
Cảm ơn. Nó sử dụng --chuid redis:redistrên start-stop-daemon. Bây giờ tôi đã thêm ulimit vào tập lệnh khởi động.
UpTheCux
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.