Khi bạn chạy ls
mà không có đối số, nó sẽ chỉ mở một thư mục, đọc tất cả nội dung, sắp xếp chúng và in chúng ra.
Khi bạn chạy ls *
, đầu tiên shell sẽ mở rộng *
, tương tự như những gì đơn giản ls
đã làm, xây dựng một vectơ đối số với tất cả các tệp trong thư mục hiện tại và các cuộc gọi ls
. ls
sau đó phải xử lý vectơ đối số đó và cho từng đối số và gọi access(2)
tệp để kiểm tra sự tồn tại của nó. Sau đó, nó sẽ in ra đầu ra giống như đầu tiên (đơn giản) ls
. Cả quá trình xử lý của shell của vectơ đối số lớn và ls
có thể sẽ liên quan đến việc phân bổ bộ nhớ cho các khối nhỏ, có thể mất một thời gian. Tuy nhiên, vì có rất ít sys
và user
thời gian, nhưng rất nhiều real
thời gian, hầu hết thời gian sẽ bị gian chờ đợi cho đĩa, thay vì sử dụng CPU làm cấp phát bộ nhớ.
Mỗi cuộc gọi đến access(2)
sẽ cần đọc inode của tập tin để có được thông tin cho phép. Điều đó có nghĩa là rất nhiều đĩa đọc và tìm kiếm hơn là chỉ đọc một thư mục. Tôi không biết các thao tác này đắt như thế nào trên GPFS của bạn, nhưng khi so sánh bạn đã chỉ ra ls -l
có thời gian chạy tương tự với trường hợp ký tự đại diện, thời gian cần thiết để lấy thông tin inode dường như chiếm ưu thế. Nếu GPFS có độ trễ cao hơn một chút so với hệ thống tệp cục bộ của bạn trên mỗi thao tác đọc, chúng tôi hy vọng nó sẽ rõ rệt hơn trong những trường hợp này.
Sự khác biệt giữa trường hợp ký tự đại diện và ls -l
50% có thể được giải thích bằng cách sắp xếp các nút trên đĩa. Nếu các nút được đặt liên tiếp theo thứ tự như tên tệp trong thư mục và ls -l
stat (2) ed các tệp theo thứ tự thư mục trước khi sắp xếp, ls -l
có thể sẽ đọc hầu hết các nút trong quá trình quét. Với ký tự đại diện, trình bao sẽ sắp xếp tên tệp trước khi chuyển chúng sang ls
, do đó ls
có thể sẽ đọc các nút theo thứ tự khác, thêm chuyển động đầu đĩa.
Cần lưu ý rằng time
đầu ra của bạn sẽ không bao gồm thời gian của trình bao để mở rộng ký tự đại diện.
Nếu bạn thực sự muốn xem những gì đang xảy ra, hãy sử dụng strace(1)
:
strace -o /tmp/ls-star.trace ls *
strace -o /tmp/ls-l-star.trace ls -l *
và có một cái nhìn mà các cuộc gọi hệ thống đang được thực hiện trong từng trường hợp.
Tôi không biết nếu access(2)
thực sự được sử dụng, hoặc một cái gì đó khác như stat(2)
. Nhưng cả hai có lẽ yêu cầu tra cứu inode (Tôi không chắc liệu access(file, 0)
có bỏ qua tra cứu inode không.)
ls
nó chỉ có thể hỏi hệ thống tập tin "những đứa trẻ của inode là gìpwd
"ls *
nó phải hỏi "những đứa trẻ (và tập tin) của inode là gìa
" theo sau là b, c, d, v.v. Một truy vấn so với nhiều.