Computer >> Máy Tính >  >> Hệ thống >> Linux

Làm thế nào để khắc phục lỗi "Quá nhiều tệp mở" trong Linux?

Rất thường xuyên ' quá nhiều tệp đang mở 'Xảy ra lỗi trên máy chủ Linux tải cao. Nó có nghĩa là một tiến trình đã mở quá nhiều tệp (bộ mô tả tệp) và không thể mở tệp mới. Trong Linux, giới hạn tệp mở tối đa được đặt theo mặc định cho từng quy trình hoặc người dùng và các giá trị khá nhỏ.

Trong bài viết này, chúng ta sẽ tìm hiểu cách kiểm tra giới hạn hiện tại về số lượng tệp đang mở tối đa trong Linux và cách thay đổi nó cho toàn bộ máy chủ lưu trữ, dịch vụ riêng lẻ hoặc phiên hiện tại.

Lỗi ‘Quá nhiều tệp đang mở’ &Giới hạn tệp mở trong Linux

Trước hết, hãy xem lỗi "quá nhiều tệp đang mở" xuất hiện ở đâu. Điều này thường xảy ra nhất trên các máy chủ có cài đặt máy chủ web NGINX / httpd hoặc máy chủ cơ sở dữ liệu (MySQL / MariaDB / PostgreSQL) khi đọc một số lượng lớn nhật ký. Ví dụ:khi máy chủ web Nginx vượt quá giới hạn tệp đang mở, bạn sẽ thấy lỗi:

socket () failed (29: Too many open files) while connecting to upstream

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Sử dụng lệnh này, bạn có thể nhận được số lượng bộ mô tả tệp tối đa mà hệ thống của bạn có thể mở:

# cat /proc/sys/fs/file-max

Giới hạn tệp đang mở cho người dùng hiện tại là 1024. Bạn có thể kiểm tra nó như sau:

# ulimit -n

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Có hai loại giới hạn: Khó Mềm . Người dùng có thể thay đổi giới hạn mềm (tuy nhiên, giá trị mềm không được vượt quá giới hạn cứng). Chỉ người dùng có đặc quyền hoặc người dùng gốc mới có thể sửa đổi giá trị giới hạn cứng.

Để hiển thị giới hạn mềm, hãy chạy lệnh sau:

# ulimit –nS

Để hiển thị giá trị giới hạn cứng:

# ulimit -nH

Làm cách nào để Tăng Giới hạn Tệp Mở Tối đa trong Linux?

Để cho phép tất cả các dịch vụ mở một số lượng lớn tệp, bạn có thể thay đổi các giới hạn trong Hệ điều hành Linux của mình. Để đặt các cài đặt mới vĩnh viễn và ngăn việc đặt lại chúng sau khi máy chủ hoặc phiên khởi động lại, bạn phải thực hiện các thay đổi đối với /etc/security/limits.conf . Thêm những dòng này:

* hard nofile 97816
* soft nofile 97816

Nếu bạn đang sử dụng Ubuntu, hãy thêm dòng này:

session required pam_limits.so

Tham số này cho phép đặt giới hạn tệp mở sau khi xác thực người dùng.

Sau khi thực hiện bất kỳ thay đổi nào, hãy tải lại thiết bị đầu cuối và kiểm tra giá trị max_open_files:

# ulimit -n

97816

Tăng Giới hạn Trình mô tả Tệp Mở trên mỗi Dịch vụ

Bạn có thể thay đổi giới hạn của bộ mô tả tệp đang mở cho một dịch vụ cụ thể, thay vì cho toàn bộ hệ điều hành. Hãy lấy apache làm ví dụ. Mở cài đặt dịch vụ bằng systemctl:

# systemctl edit httpd.service

Thêm các giới hạn bạn muốn, ví dụ:

[Service]
LimitNOFILE=16000
LimitNOFILESoft=16000

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Sau khi thực hiện các thay đổi, hãy cập nhật cấu hình dịch vụ và khởi động lại:

# systemctl daemon-reload
# systemctl restart httpd.service

Để đảm bảo nếu các giá trị đã thay đổi, hãy tải dịch vụ PID:

# systemctl status httpd.service

Ví dụ:PID của dịch vụ là 3724:

# cat /proc/3724/limits | grep "Max open files”

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Do đó, bạn đã thay đổi các giá trị cho số tệp mở tối đa cho một dịch vụ cụ thể.

Cách đặt giới hạn tệp mở tối đa cho Nginx &Apache?

Khi thay đổi giới hạn về số lượng tệp đang mở cho máy chủ web, bạn cũng phải thay đổi tệp cấu hình dịch vụ. Ví dụ:chỉ định / thay đổi giá trị chỉ thị sau trong tệp cấu hình Nginx /etc/nginx/nginx.conf :

worker_rlimit_nofile 16000
Khi định cấu hình Nginx trên máy chủ 8 lõi được tải nhiều với worker_connections 8192, bạn cần chỉ định 8192 * 2 * 8 (vCPU) = 131072 trong worker_rlimit_nofile.

Sau đó khởi động lại Nginx.

Đối với apache, hãy tạo một thư mục:

# mkdir /lib/systemd/system/httpd.service.d/

Sau đó, tạo tệp limit_nofile.conf:

# nano /lib/systemd/system/httpd.service.d/limit_nofile.conf

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Thêm vào nó:

[Service]
LimitNOFILE=16000

Đừng quên khởi động lại httpd.

Thay đổi Giới hạn Tệp Mở cho Phiên Hiện tại

Để thay đổi giới hạn tệp mở tối đa cho phiên đầu cuối của bạn, hãy chạy lệnh sau:

# ulimit -n 3000

Sau khi đóng thiết bị đầu cuối và tạo phiên mới, các giới hạn sẽ quay trở lại giá trị ban đầu được chỉ định trong /etc/security/limits.conf .

Để thay đổi giá trị chung cho hệ thống / proc / sys / fs / file-max , thay đổi giá trị fs.file-max trong /etc/sysctl.conf:

fs.file-max = 100000

Và áp dụng nó:

# sysctl -p

Làm thế nào để khắc phục lỗi  Quá nhiều tệp mở  trong Linux?

Trong bài viết này, chúng tôi đã tìm hiểu cách giải quyết vấn đề khi giá trị của giới hạn bộ mô tả tệp mở trong Linux quá nhỏ và thảo luận về một số tùy chọn thay đổi các giới hạn này trên máy chủ.