Sửa đổi ulimit (mở tệp) của một quy trình cụ thể


27

Có thể thay đổi giới hạn mềmcứng của một quy trình cụ thể không?

Trong trường hợp của tôi, quy trình của tôi là mongodvà rất nhiều tài nguyên web bảo tôi chỉ cần thực thi:

ulimit -n <my new value>

Suy nghĩ hiện tại của tôi:

  • Làm thế nào để lệnh biết giới hạn của quy trình mà tôi sẽ sửa đổi? Điều này sẽ không sửa đổi toàn bộ hệ thống mở giới hạn tập tin?
  • Tôi đoán rằng lệnh này chỉ thay đổi giới hạn mềm. Vậy có cách nào để tăng giới hạn cứng không?

Bạn đã đọc đoạn thông tin có giá trị này? docs.mongodb.org/manual/reference/ulimit
tink

Vâng, tôi đã học được tất cả bằng trái tim .. Tôi không chắc mình có thiếu thứ gì không nhưng trang đó chỉ cho bạn biết cách XEM chi tiết. Nó chỉ bảo bạn viết ulimit -n <value> ...
kiểm tra

Câu trả lời:


29

Một quá trình có thể thay đổi giới hạn của nó thông qua setrlimit(2)cuộc gọi hệ thống. Khi bạn chạy ulimit -nbạn sẽ thấy một số. Đó là giới hạn hiện tại về số lượng bộ mô tả tệp mở (bao gồm tệp, ổ cắm, đường ống, v.v.) cho quy trình. Các ulimitlệnh thực hiện các getrlimit(2)cuộc gọi hệ thống để tìm ra những giá trị hiện tại là.

Đây là điểm mấu chốt: một quy trình kế thừa giới hạn hiện tại từ quy trình mẹ của nó. Vì vậy, nếu bạn đã chạy, ulimit -n 64bạn sẽ đặt giới hạn của bộ mô tả tệp mở đó thành 64. Bất kỳ quy trình nào bắt đầu sẽ có cùng giới hạn, trừ khi quy trình mới đó gọi setrlimit()một cách thích hợp.

Để thay đổi mongodb'sgiới hạn mô tả tệp mở, bạn sẽ chạy ulimit -n 2048(hoặc bất kỳ số lượng lớn nào mà kernel của bạn cho phép) trong một trình bao. Sau đó, bạn sẽ sử dụng vỏ đó để bắt đầu mongodb. Là một quá trình con, mongodbsẽ kế thừa giới hạn (lớn) trên các mô tả tệp mở.

Để sửa đổi giới hạn tệp mở của hệ thống, có vẻ giống như tổng của tất cả các quy trình giới hạn mô tả tệp mở, bạn phải làm một cái gì đó như sửa đổi /etc/sysctl.confvà chạy sysctl -p. Nhìn vào giá trị của fs.file-maxtham số trong /etc/sysctl.conf.


Thật là một lời giải thích tuyệt vời! Cảm ơn nhiều. Tôi sẽ thử nó ngay lập tức!
kiểm tra

Câu trả lời này đã giúp tôi rất nhiều, nhưng vấn đề bây giờ là giới hạn cứng là 2048, và điều này là không đủ trong trường hợp của tôi. 1) làm thế nào tôi có thể tìm thấy giới hạn mà kernel của tôi cho phép? 2) Có thể thay đổi GIỚI HẠN CỨNG bây giờ không? Cảm ơn một lần nữa!
kiểm tra

@test - Tôi chưa bao giờ tăng giới hạn cứng. Tìm thấy cái này: blog.samat.org/2011/04/05/wiki này.oustkeke.com/wiki/Increas-File-Descriptor-Limit-on-Linux Họ nói điều tương tự.
Bruce Ediger

18

Để thay đổi giới hạn của một quy trình đang chạy, bạn có thể sử dụng lệnh tiện ích prlimit.

prlimit --pid 12345 --nofile=1024:1024

Những gì mà nội bộ là để gọi setrlimit(2). Trang man của prlimit nên chứa một số ví dụ về cách gọi hữu ích.

Nguồn: https://sig-io.nl/posts/run-time-editing-of-limits-in-linux/


Điều này đã cứu ngày của tôi, cảm ơn. Tôi đã có một quá trình Python chạy dài đang tạo ra too many files openlỗi. Câu trả lời của bạn đã giải quyết vấn đề của tôi mà không dừng quá trình.
Visionscaper

1

Trên Linux ít nhất, hầu hết các distro dường như sử dụng pam để xác thực. Một mô-đun đi kèm với pam là mô-đun giới hạn . Trích dẫn từ README cho pam_limits:

The pam_limits PAM module sets limits on the system resources that can be obtained in a user-session. Users of uid=0 are affected by this limits, too.

Do đó, bạn có thể đặt giới hạn cho mỗi người dùng, mỗi nhóm và giới hạn mặc định, trong cả hai loại cứng (gốc đặt điều này và quy trình không thể yêu cầu cao hơn) và giới hạn mềm. Các giới hạn mềm thường được đặt thấp hơn giới hạn cứng và ứng dụng có thể tăng nó lên cho đến khi đạt đến giới hạn cứng.

Trong trường hợp của bạn, nếu quy trình bạn muốn tăng giới hạn hoạt động như một người dùng thông thường, bạn có thể tăng giới hạn cho người dùng hoặc nhóm đó. Ví dụ, tôi có một số công việc cron mysql trên một số máy chủ yêu cầu xử lý tệp bổ sung được mở, vì vậy tôi đặt điều này:

$ cat /etc/security/limits.d/mysql.conf
@mysql           soft    nofile          100000
@mysql           hard    nofile          200000

Không có gì cần phải khởi động lại; Khi bạn kiện người dùng đó, bạn có thể thấy ngay rằng các giới hạn mới có hiệu lực.

Một điều khác mà bạn có thể làm nếu bạn đang sử dụng hệ thống dẫn xuất RedHat điển hình là đặt cuộc gọi ulimit mà bạn muốn vào tập lệnh / etc / sysconfig / $ SERVICE. Ví dụ, tập lệnh init của apache được đặt tên là /etc/init.d/httpd và nó cung cấp tệp cấu hình / etc / sysconfig / httpd nếu tìm thấy. Tôi đã thấy việc quản lý dễ dàng hơn bằng cách thực hiện việc này thay vì tự chỉnh sửa tập lệnh init vì tập lệnh init được cập nhật khi vòng tua được nâng cấp, nhưng tập tin sysconfig chỉ được cập nhật nếu chúng không được thay đổi so với mặc định.


Giải pháp tốt nhất và thiết thực nhất.
nelaaro

0

Làm thế nào để lệnh biết giới hạn của quy trình mà tôi sẽ sửa đổi? Điều này sẽ không sửa đổi toàn bộ hệ thống mở giới hạn tập tin?

Lệnh sẽ thay đổi giới hạn cho quy trình hiện tại (trình bao của bạn) và bất kỳ quy trình con nào (bất cứ điều gì bạn chạy từ trình bao sau đó).

Các quy trình được tổ chức trong một cái cây. Mỗi quá trình có một cha mẹ (mà gọi nó). Quá trình số 1, init, là một quá trình đặc biệt ở chỗ nó là cha mẹ của chính nó. Các công cụ như htop hoặc top có thể hiển thị cho bạn các quy trình được hiển thị dưới dạng cây của cha mẹ và trẻ em.

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.