hoạt động trong / dev / shm gây ra tràn


7

Tôi đang lặp lại hàng chục ngàn thao tác tương tự trong / dev / shm, mỗi thao tác được tạo, thư mục được ghi và sau đó xóa. Giả định của tôi trước đây là tôi thực sự đang tạo các thư mục và loại bỏ chúng tại chỗ, do đó mức tiêu thụ bộ nhớ phải khá thấp. Tuy nhiên, hóa ra việc sử dụng khá cao và cuối cùng đã khiến bộ nhớ bị tràn. Vì vậy, câu hỏi của tôi là: với các hoạt động như

mkdir /dev/shm/foo
touch /dev/shm/foo/bar
[edit] /dev/shm/foo/bar
....
rm -rf /dev/shm/foo

Nó cuối cùng sẽ gây ra tràn bộ nhớ? và nếu có, tại sao vậy, vì nó dường như đang loại bỏ chúng tại chỗ.

Lưu ý: đây là một hoạt động tương tự hàng chục ngàn.

Câu trả lời:


6

Tò mò, vì bạn đang chạy ứng dụng này, điều gì df -h /dev/shmthể hiện mức độ sử dụng RAM của bạn?

tmpfs

Theo mặc định, nó thường được thiết lập với 50% dung lượng RAM mà hệ thống có. Điều này được ghi lại ở đây trên kernel.org, dưới tài liệu hệ thống tập tin cho tmpfs. Ngoài ra, nó được đề cập trong mounttrang người đàn ông.

trích từ trang người đàn ông gắn kết

Số lượng nút tối đa cho trường hợp này. Mặc định là một nửa số trang RAM vật lý của bạn hoặc (trên máy có highmem) số trang RAM lowmem, tùy theo số nào thấp hơn.

xác nhận

Trên máy tính xách tay của tôi có RAM 8GB, tôi có các thiết lập sau /dev/shm:

$ df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 3.9G  4.4M  3.9G   1% /dev/shm

Chuyện gì đang xảy ra vậy?

Tôi nghĩ điều đang xảy ra là ngoài việc được phân bổ 50% RAM để bắt đầu, về cơ bản bạn đang tiêu thụ toàn bộ 50% theo thời gian và đang đẩy /dev/shmkhông gian của bạn thành trao đổi, cùng với 50% RAM còn lại.

Lưu ý rằng một đặc điểm khác của tmpfsvs. ramfstmpfscó thể được đẩy vào trao đổi nếu cần:

trích từ geek ware.com

                    Table: Comparison of ramfs and tmpfs

Experimentation                          Tmpfs                Ramfs
---------------                          -----                -----
Fill maximum space and continue writing  Will display error   Will continue writing
Fixed Size                               Yes                  No
Uses Swap                                Yes                  No
Volatile Storage                         Yes                  Yes

Vào cuối ngày, đó là một hệ thống tập tin được triển khai trong RAM, vì vậy tôi hy vọng nó sẽ hoạt động giống như cả hai. Điều tôi muốn nói là điều này là khi các tệp / thư mục bị xóa, bạn đang sử dụng một số trang bộ nhớ vật lý cho bảng inode và một số cho không gian thực tế được sử dụng bởi các tệp / thư mục này.

Thông thường, khi bạn sử dụng không gian trên ổ cứng, bạn thực sự không giải phóng không gian vật lý, chỉ có các mục trong bảng inode, nói rằng không gian được sử dụng bởi một tệp cụ thể hiện có sẵn.

Vì vậy, từ quan điểm của RAM, không gian được sử dụng bởi các tệp chỉ là các trang bẩn trong bộ nhớ. Vì vậy, nó sẽ mạnh mẽ trao đổi chúng ra theo thời gian.

Không rõ có tmpfslàm gì đặc biệt để dọn sạch RAM thực tế được sử dụng bởi hệ thống tập tin mà nó cung cấp không. Tôi thấy đề cập đến trong một số diễn đàn mà mọi người thấy rằng phải mất tới 15 phút để hệ thống của họ "lấy lại" không gian cho các tệp mà họ đã xóa trong /dev/shm.

Có lẽ bài báo này tôi đã tìm thấy trên tmpfstiêu đề: tmpfs: Hệ thống tệp bộ nhớ ảo sẽ làm sáng tỏ hơn về cách thức triển khai ở cấp thấp hơn và cách thức hoạt động của nó đối với VMM. Bài viết được viết riêng cho SunOS nhưng có thể có một số manh mối.

thử nghiệm

Các thử nghiệm giả định sau đây dường như cho thấy /dev/shmcó thể tự làm sạch.

Thí nghiệm 1

Tạo một thư mục với một tệp duy nhất bên trong nó, và sau đó xóa thư mục 1000 lần.

trạng thái ban đầu của /dev/shm
$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm
điền vào nó với các tập tin
$ for i in `seq 1 1000`;do mkdir /dev/shm/sam; echo "$i" \
      > /dev/shm/sam/file$i; rm -fr /dev/shm/sam;done
trạng thái cuối cùng của /dev/shm
$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5528   3988216   1% /dev/shm

thí nghiệm # 2

Tạo một thư mục với một tệp 50 MB duy nhất bên trong nó, sau đó xóa thư mục 300 lần.

lấp đầy nó với 50MB tệp rác ngẫu nhiên
$ start_time=`date +%s`
$ for i in `seq 1 300`;do mkdir /dev/shm/sam;                     \
   dd if=/dev/random of=/dev/shm/sam/file$i bs=52428800 count=1 > \
   /dev/shm/sam/file$i.log; rm -fr /dev/shm/sam;done              \
   && echo run time is $(expr `date +%s` - $start_time) s

...
8 bytes (8 B) copied, 0.247272 s, 0.0 kB/s
0+1 records in
0+1 records out
9 bytes (9 B) copied, 1.49836 s, 0.0 kB/s
run time is 213 s
trạng thái cuối cùng của /dev/shm

Một lần nữa, không có sự gia tăng đáng chú ý trong không gian tiêu thụ /dev/shm.

$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm

phần kết luận

Tôi không nhận thấy bất kỳ hiệu ứng rõ rệt nào khi thêm tệp và thư mục với /dev/shm. Chạy nhiều lần ở trên dường như cũng không có tác dụng gì với nó. Vì vậy, tôi không thấy bất kỳ vấn đề nào với việc sử dụng /dev/shmtheo cách bạn đã mô tả.


Cảm ơn @sim, Đó là một thử nghiệm ấn tượng, mặc dù tôi nghĩ rằng tôi đã có cảm giác hoang dã. Nó có thể là do việc viết một tập tin, lấy đi tất cả những ký ức có sẵn. Tôi sẽ kiểm tra lại và có thể quay lại với bạn sau
Daniel
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.