Tôi đang trả lời cho thẻ linux . Câu trả lời của tôi chỉ dành riêng cho Linux .
Có, các trang lớn dễ bị phân mảnh hơn. Có hai khung nhìn của bộ nhớ, một khung nhìn mà quá trình của bạn nhận được (ảo) và một khung nhìn mà kernel quản lý (thực). Bất kỳ trang nào càng lớn, sẽ càng khó nhóm (và giữ nó với) hàng xóm của nó, đặc biệt là khi dịch vụ của bạn đang chạy trên một hệ thống cũng phải hỗ trợ những người khác mặc định phân bổ và ghi vào bộ nhớ nhiều hơn họ thực sự cuối cùng sử dụng.
Ánh xạ của các địa chỉ được cấp (thực) của kernel là riêng tư. Có một lý do rất chính đáng tại sao không gian người dùng xem chúng là kernel trình bày chúng, bởi vì kernel cần có khả năng vượt mức mà không gây nhầm lẫn cho không gian người dùng. Quá trình của bạn có được một không gian địa chỉ "Disneyfied" đẹp, liền kề để làm việc, không biết gì về nhân thực sự đang làm với bộ nhớ đó đằng sau hậu trường.
Lý do bạn thấy hiệu suất bị suy giảm trên các máy chủ chạy dài rất có thể là do các khối được phân bổ chưa bị khóa rõ ràng (ví dụ mlock()
/ mlockall()
hoặc posix_madvise()
) và không được sửa đổi trong một thời gian đã bị loại bỏ , điều đó có nghĩa là dịch vụ của bạn trượt vào đĩa khi nó phải đọc họ Sửa đổi hành vi này làm cho quy trình của bạn trở thành hàng xóm tồi , đó là lý do tại sao nhiều người đưa RDBMS của họ lên một máy chủ hoàn toàn khác so với web / php / python / ruby / bất cứ điều gì. Cách duy nhất để khắc phục điều đó, hoàn toàn, là giảm sự cạnh tranh cho các khối liền kề.
Sự phân mảnh chỉ thực sự đáng chú ý (trong hầu hết các trường hợp) khi trang A nằm trong bộ nhớ và trang B đã chuyển sang hoán đổi. Đương nhiên, việc bắt đầu lại dịch vụ của bạn dường như sẽ 'chữa trị' điều này, nhưng chỉ vì hạt nhân chưa có cơ hội để đưa ra quy trình '(bây giờ) các khối mới được phân bổ trong giới hạn của tỷ lệ thừa.
Trên thực tế, việc bắt đầu lại (giả sử) 'apache' dưới tải trọng cao có khả năng sẽ gửi các khối thuộc sở hữu của các dịch vụ khác vào thẳng đĩa. Vì vậy, vâng, 'apache' sẽ cải thiện trong một thời gian ngắn, nhưng 'mysql' có thể bị ảnh hưởng .. ít nhất là cho đến khi hạt nhân khiến chúng đau khổ như nhau khi đơn giản là thiếu bộ nhớ vật lý dồi dào.
Thêm bộ nhớ, hoặc chia tách những malloc()
người tiêu dùng khó tính :) Nó không chỉ là sự phân mảnh mà bạn cần phải xem xét.
Cố gắng vmstat
có được một cái nhìn tổng quan về những gì thực sự được lưu trữ ở đâu.