Tại sao Hoán đổi được sử dụng khi còn nhiều bộ nhớ trống?


35

Tôi có máy chủ web (chuyên dụng) khá tốt với tài nguyên bộ nhớ tốt:

System information
Server load     2.19 (8 CPUs)   
Memory Used     29.53% (4,804,144 of 16,267,652)    
Swap Used   10.52% (220,612 of 2,097,136)   

Như bạn có thể thấy, máy chủ của tôi đang sử dụng trao đổi khi có nhiều bộ nhớ trống.

Điều này là bình thường hay có gì đó không đúng với cấu hình hoặc mã hóa?

NB
Quá trình MySQL của tôi đang sử dụng hơn 160% năng lượng CPU vì một số lý do; Tôi không biết tại sao, nhưng tôi không có hơn 70 người dùng đồng thời ...


Ứng dụng có thể sử dụng hơn 100% CPU trong Linux? Ơ ...
BlueRaja

5
@BlueRaja: Có, bởi vì trong việc sử dụng CPU của Linux được đo tương đối với một CPU, không phải tất cả các CPU trong hệ thống của bạn. Vì vậy, trong một máy có 8 CPU, bạn có sẵn tối đa 800% CPU.
Daniel Pryden

Bạn đang sử dụng phiên bản MySQL nào ???
RolandoMySQLDBA

@RolandoMySQLDBA phiên bản 5.5
user1179459

Câu trả lời:


61

Điều này là hoàn toàn bình thường.

Khi khởi động hệ thống, một số dịch vụ bắt đầu. Các dịch vụ này tự khởi tạo, đọc trong tệp cấu hình, tạo cấu trúc dữ liệu, v.v. Họ sử dụng một số bộ nhớ. Nhiều dịch vụ trong số này sẽ không bao giờ chạy lại trong toàn bộ thời gian hệ thống hoạt động vì bạn không sử dụng chúng. Một số trong số họ có thể chạy trong vài giờ, ngày hoặc tuần. Tuy nhiên, tất cả dữ liệu này là trong bộ nhớ vật lý.

Tất nhiên, hệ thống không thể vứt dữ liệu này đi. Nó không thể chứng minh rằng nó sẽ không bao giờ được truy cập. Một trong những dịch vụ đó, ví dụ, có thể là dịch vụ cung cấp cho bạn quyền truy cập từ xa vào hộp. Bạn có thể không sử dụng nó trong một tuần, nhưng nếu bạn sử dụng nó, nó có công việc tốt hơn.

Nhưng hệ thống biết rằng nó có thể muốn sử dụng bộ nhớ vật lý đó cho những thứ như bộ đệm đĩa hoặc theo những cách khác sẽ cải thiện hiệu suất. Vì vậy, nó không trao đổi cơ hội. Khi không có gì tốt hơn để làm, nó ghi dữ liệu chưa được sử dụng trong một thời gian rất dài vào đĩa, sử dụng không gian trao đổi. Tuy nhiên, nó vẫn giữ các trang trong bộ nhớ vật lý. Vì vậy, họ vẫn có thể được truy cập mà không cần phải trao đổi chúng trong.

Bây giờ, nếu sau này hệ thống cần bộ nhớ vật lý đó cho một thứ khác, nó có thể đơn giản ném những trang đó đi vì nó đã được viết chúng để trao đổi. Điều này mang lại cho hệ thống tốt nhất của cả hai thế giới. Dữ liệu vẫn được lưu trong bộ nhớ, vì vậy nó có thể được truy cập mà không cần phải đọc nó từ đĩa. Nhưng nếu hệ thống cần bộ nhớ đó cho mục đích khác, nó sẽ không phải ghi nó ra trước. Thắng lớn tất cả xung quanh.


Trong trường hợp đó, bạn có thể vui lòng giải thích tại sao đôi khi không gian hoán đổi hoàn toàn không được sử dụng. Mem: 49554484k tổng, 4087592k sử dụng, 45466892k miễn phí, 349244k đệm Trao đổi: Tổng 94204k, 0k sử dụng, 94204k miễn phí, 1113644k cache
Ananthan

4
@ananthan: Có thể có nhiều lý do. Nhiều khả năng là hệ thống chưa bao giờ chịu bất kỳ áp lực bộ nhớ nào, ngay cả do ghi đệm, do đó mã hoán đổi cơ hội có thể chưa bao giờ được kích hoạt. Nó cũng có thể là ai đó nghĩ rằng bất kỳ việc sử dụng trao đổi là xấu và điều chỉnh sai hệ thống để không trao đổi cơ hội (bằng cách giảm swappiness ).
David Schwartz

6

Điều này có thể xảy ra nếu một lúc nào đó bạn cần nhiều bộ nhớ hơn là bạn có RAM vật lý trong máy. Tại thời điểm đó, một số dữ liệu sẽ được ghi vào không gian trao đổi.

Khi bộ nhớ sau được giải phóng, dữ liệu từ trao đổi sẽ không tự động đọc lại vào RAM: điều này chỉ xảy ra khi dữ liệu trong trao đổi thực sự cần thiết bởi một số quy trình. Điều này là hoàn toàn bình thường.

Đối với quy trình mysql của bạn: tất cả phụ thuộc vào loại truy vấn bạn chạy. Trong lý thuyết 2 các truy vấn rất phức tạp có thể đủ để tải như vậy, bất kể số lượng người dùng của bạn là bao nhiêu. Bạn có thể kích hoạt nhật ký truy vấn chậm để hiểu rõ hơn về những truy vấn nào cần nhiều tải.


Không - sử dụng trao đổi không phải là một dấu nước cao. Khi các trang bị tráo đổi được ánh xạ trở lại, các trang đĩa được đánh dấu là không sử dụng (nhưng vẫn có thể chứa dữ liệu).
symcbean

Tôi chỉ đề cập đến một kịch bản trong đó bạn có thể sử dụng trao đổi, nhưng điều này thực sự không phải lúc nào cũng có triệu chứng là không có đủ bộ nhớ vật lý - như David Schwartz đã giải thích ở trên
brain99

3

Bạn cũng có thể thay đổi hành vi này bằng cách sysctl -w vm.swappiness=10, điều này sẽ làm giảm đáng kể việc sử dụng trao đổi cho đến khi thực sự cần thiết.

Đối với MySQL, ít nhất bạn đã thực hiện một bài kiểm tra cấu hình cơ bản bằng cách sử dụng tập lệnh tun-primer.sh chưa?


1
Điều này sẽ làm tăng xu hướng cho bộ đệm / bộ đệm được thu hồi. Thật không may là không rõ ràng từ câu hỏi ban đầu liệu con số 29,53% có bao gồm bộ đệm / bộ đệm hay không - nếu không, thì việc thay đổi mà bạn cố gắng sẽ có tác động xấu đến hiệu suất. Nếu dbms này đang sử dụng innodb một cách rộng rãi thì có lẽ nó đã bị cấu hình kém (mặc dù một hộp 16gb 8 lõi duy nhất để sử dụng làm máy chủ web là một lựa chọn định nghĩa BAD để bắt đầu)
symcbean

Tại sao bạn nói sự lựa chọn tồi cho máy chủ web? Tôi không sử dụng innodb nhiều, tôi vẫn thích myisam vì số lần đọc của tôi là 70% và chỉ viết 30% ....
user1179459

1

Đây có lẽ là, như David đã giải thích, một hành vi bình thường của Hạt nhân Linux, nhưng nó cũng có thể là một sự cố xảy ra trong vấn đề điên cuồng trao đổi MySQL . Trong trường hợp của bạn (8 CPU, tổng RAM 16 GB, 5 GB đã sử dụng), để điều đó xảy ra, máy tính của bạn phải là hệ thống NUMA với 4 nút (ổ cắm) và 4 GB RAM cho mỗi nút và nhóm bộ đệm MySQL InnoDB là 4 GB.

Tóm lại (bạn nên đọc liên kết ở trên để biết chi tiết đầy đủ), đây là những gì xảy ra:

  1. Khi hệ thống của bạn khởi động, các quy trình được trải đều trên tất cả các nút NUMA bằng cách sử dụng một số bộ nhớ của chúng.
  2. Khi MySQL khởi động, nó phân bổ 4 GB cho nhóm bộ đệm InnoDB, lấp đầy RAM của một nút NUMA và sử dụng một số RAM trên các nút khác.
  3. Sau đó, nhân Linux, không thể di chuyển RAM được phân bổ từ một nút NUMA sang nút khác, cho rằng nên trao đổi các trang từ nút bị bỏ đói (hoặc cần phải trao đổi các trang vì các trang cần được hoán đổi).

Để tránh điều đó, hãy thay đổi cấp phát bộ nhớ cho MySQL để phân bổ RAM trên tất cả các lõi (xem liên kết ở trên để biết thêm chi tiết).

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.