- Bắt đầu từ màn hình htop trên Ubuntu Server 16.04 x64 để lần theo bằng
/procvà đầu ra lệnh xem uptime, load average, Tasks, PID, cây tiến trình, trạng thái, thời gian CPU, độ ưu tiên và các chỉ số bộ nhớ thực sự có ý nghĩa gì - Nhiều giá trị trên màn hình đến từ procfs và các tệp hệ thống như
/etc/passwd,/etc/group,/etc/shadow,/etc/nsswitch.conf; có thể dùngstraceđể kiểm tra chương trình đang đọc những tệp nào - Load average không phải là giá trị giống với mức sử dụng CPU; đây là trung bình trượt hàm mũ suy giảm bao gồm các tiến trình đang chạy, đang chờ chạy và các tiến trình ở trạng thái uninterruptible
- Các mã trạng thái như
R,S,D,Z,T,tliên quan tới signal,kill, hành vifork/exec/wait, nên là manh mối để xác định vì sao tiến trình bị dừng hoặc vẫn còn tồn tại VIRT,RES,SHR,MEM%cho thấy bộ nhớ ảo, bộ nhớ vật lý và bộ nhớ có thể chia sẻ từ các góc nhìn khác nhau, nên khó kết luận mức dùng bộ nhớ thực tế chỉ từ một con số
Các giá trị trong htop đến từ đâu
uptimecho biết hệ thống đã chạy bao lâu; cùng thông tin này cũng có thể kiểm tra bằng lệnhuptime- Chương trình
uptimeđọc/proc/uptime- Số thứ nhất là tổng thời gian tính bằng giây mà hệ thống đã bật
- Số thứ hai là thời gian tính bằng giây mà hệ thống ở trạng thái idle
- Trên hệ thống đa lõi, thời gian idle được cộng dồn theo từng lõi nên có thể lớn hơn tổng uptime
- Có thể xem các tệp mà
uptimemở bằngstrace uptime 2>&1 | grep openhoặcstrace -e open uptime- Đầu ra ví dụ bao gồm
/proc/uptime,/var/run/utmp,/proc/loadavg
- Đầu ra ví dụ bao gồm
- Các con số trong
/proc/uptimethuận tiện để dùng trong chương trình hoặc script, còn đầu rauptimeđược định dạng để con người dễ đọc
Load average và mức sử dụng CPU
- Ba giá trị đầu trong
/proc/loadavgbiểu thị load average của hệ thống trong 1 phút, 5 phút, 15 phút gần nhất - Giá trị thứ tư hiển thị số tiến trình đang chạy và tổng số tiến trình theo dạng như
1/120, còn giá trị cuối là PID được sử dụng gần nhất - Khi chạy một tiến trình mới, PID sẽ được cấp phát; PID thường tăng dần rồi được tái sử dụng khi cạn
- PID 1 thuộc về
/sbin/init, tiến trình được khởi chạy khi boot
- PID 1 thuộc về
- Nếu trong
htopchỉ thấy một tiến trình đang chạy thì đó có thể chính làhtop sleep 30không ở trạng thái running mà ở trạng thái sleep, nên không làm tăng số running process- Tác vụ liên tục dùng CPU như
cat /dev/urandom > /dev/nullsẽ làm tăng số running process và load average - Load number là giá trị đếm các tiến trình đang chạy, đang chờ chạy hoặc ở trạng thái uninterruptible
- load average không phải trung bình đơn giản mà là trung bình trượt hàm mũ suy giảm
- Ngay cả load average 1 phút cũng không chỉ phản ánh 60 giây cuối mà đặt trọng số lớn hơn cho 1 phút gần nhất, đồng thời vẫn bao gồm một phần hoạt động trước đó
- Trên hệ thống một CPU, nếu có một tiến trình CPU-bound thì có thể đơn giản hóa rằng load average
1.00tương ứng CPU dùng 100%- Trên hệ thống 2 lõi, cùng tình huống đó có thể xem là mức sử dụng CPU 50%
- Có thể đơn giản hóa rằng load average tương ứng với CPU 100% trên hệ thống 2 lõi là
2.00
- Cách đơn giản hóa này không phải lúc nào cũng đúng vì các tiến trình ở trạng thái uninterruptible cũng được tính vào load
- Cũng có thể xảy ra tình huống load average cao nhưng mức sử dụng CPU không cao
- Có thể kiểm tra mức sử dụng CPU tức thời bằng
mpstatsudo apt install sysstat -ympstat 1
Tasks, PID, cây tiến trình
- Tasks ở góc trên bên phải của
htophiển thị tổng số tiến trình và số tiến trình đang chạy - Linux kernel nội bộ gọi tiến trình là task, và
htopdùng Tasks thay cho Processes để tiết kiệm không gian màn hình - Có thể bật/tắt hiển thị thread bằng
Shift+H- Nếu thấy như
Tasks: 23, 10 thrthì đang hiển thị thread
- Nếu thấy như
- Có thể bật/tắt hiển thị kernel thread bằng
Shift+K- Nếu thấy như
Tasks: 23, 40 kthrthì đang hiển thị kernel thread
- Nếu thấy như
- Mỗi khi một tiến trình mới khởi động, một PID sẽ được cấp phát
- Nếu chạy nền như
sleep 1000 &thì số job và PID sẽ được hiển thị $!trongbashsẽ được mở rộng thành ID của tiến trình nền gần nhất
- Nếu chạy nền như
- Thông tin liên quan tới tiến trình nằm dưới
/proc/<pid>//proc/<pid>/cmdlinechứa lệnh được chạy và các đối số được phân tách bằng byte\0- Có thể xem dễ đọc hơn bằng
tr '\0' '\n' < /proc/<pid>/cmdlinehoặcstrings /proc/<pid>/cmdline /proc/<pid>/cwdlà liên kết tới thư mục làm việc hiện tại, còn/proc/<pid>/exelà liên kết tới tệp nhị phân đã chạy
- Các công cụ chẩn đoán như
htop,top,psđọc chi tiết tiến trình từ/proc/<pid>/<file> - Bên tạo tiến trình mới gọi là parent process, bên được tạo mới gọi là child process; quan hệ này tạo thành cây tiến trình
- Trong
htop, nhấnF5để xem phân cấp tiến trìnhps fvàpstree -acũng hiển thị cùng quan hệ đó
- Khi chạy
datetrongbash,bashtạo một bản sao của chính nó bằngfork, nạp/bin/datevào bộ nhớ bằngexec, rồibashparent chờ child kết thúc /sbin/initđược khởi chạy khi boot và khởi tạosshd; khi kết nối SSH,sshdtạo tiến trình phiên làm việc, và tiến trình phiên đó chạy shellbash
Người dùng tiến trình và quyền hạn
- Mỗi tiến trình thuộc sở hữu của một người dùng, và người dùng được biểu diễn bằng ID dạng số
- Có thể kiểm tra ID người dùng của tiến trình qua mục
Uidtrong/proc/<pid>/status - Lệnh như
id 1000sẽ hiển thị tên người dùng và nhóm tương ứng với ID dạng số đó idchọn nguồn phân giải tên theo cấu hình trong/etc/nsswitch.conf- Trên hệ thống ví dụ, nó đọc
/etc/passwdvà/etc/group compatlà chế độ tương thích, giốngfilesnhưng cho phép các mục đặc biệt- Thông tin người dùng cũng có thể được lưu trong các cơ sở dữ liệu hoặc dịch vụ khác như LDAP
- Trên hệ thống ví dụ, nó đọc
/etc/passwdvà/etc/grouplà các tệp văn bản thuần ánh xạ ID số sang tên mà con người có thể đọc được- Thông tin mật khẩu thực tế nằm trong
/etc/shadow$6$nghĩa là thuật toán bămsha512- Sau đó là salt ngẫu nhiên để ngăn tấn công rainbow table và giá trị băm của password+salt
- Theo mặc định, chương trình chạy với quyền của người dùng đã thực thi nó
- Điều này vẫn đúng ngay cả khi chủ sở hữu của tệp thực thi là người dùng khác
- Muốn chạy bằng người dùng khác hoặc
rootthì dùngsudosudo idsẽ chạy với UID 0 củaroot- Có thể chạy bằng người dùng cụ thể như
sudo -u daemon id
- Nếu cố ghi trực tiếp vào
/etc/sudoersbằng redirect thì chỉechochạy với quyền root còn thao tác append vẫn do người dùng hiện tại thực hiện nên có thể thất bạiecho "$USER ALL=(ALL) NOPASSWD: ALL" | sudo tee -a /etc/sudoerssudo bash -c "echo '$USER ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers"
- Nên chỉnh sửa
/etc/sudoersbằngsudo visudo- Nó kiểm tra nội dung trước khi lưu để tránh lỗi khiến
sudokhông dùng được nữa
- Nó kiểm tra nội dung trước khi lưu để tránh lỗi khiến
/usr/bin/passwdvẫn có thể ghi vào/etc/shadowdù được người dùng thường chạy- Quyền tệp có
snên nó hoạt động như một tệp thực thi setuid - Nó chạy với quyền của chủ sở hữu tệp thực thi là
root - Có thể tìm các tệp thực thi setuid thuộc sở hữu root bằng
find /bin -user root -perm -u+s
- Quyền tệp có
Mã trạng thái tiến trình
- Cột trạng thái của
htopđược hiển thị với tênS, các giá trị chính như sauR: running hoặc runnable, đang chạy hoặc đang chờ trong run queueS: interruptible sleep, đang chờ một sự kiện hoàn tấtD: uninterruptible sleep, thường là đang chờ I/OZ: defunct zombie, đã kết thúc nhưng parent chưa reapT: bị dừng bởi job control signalt: bị debugger dừng trong lúc tracingX: dead, trạng thái lẽ ra không nên xuất hiện
pscũng hiển thị các substate nhưSs,R+,Ss+-
R: Đang chạy hoặc có thể chạy
- Trạng thái
Rlà khi tiến trình đang thực sự chạy hoặc đang chờ trong hàng đợi thực thi - Mã nguồn chương trình sau khi biên dịch trở thành lệnh CPU, và khi chạy sẽ được nạp vào bộ nhớ để CPU thực thi các lệnh đó
- Đang chạy nghĩa là CPU đang thực sự thực thi các lệnh đó
- Trạng thái
-
S: Sleep có thể bị ngắt
- Ở trạng thái
S, các lệnh của tiến trình không chạy trên CPU mà đang chờ một sự kiện hoặc điều kiện - Khi sự kiện xảy ra, kernel sẽ đổi trạng thái sang running
sleep 1000là ví dụ về việc chờ trong một khoảng thời gian chỉ định- Trạng thái này có thể bị ngắt bằng signal
- Trong
htop, có thể nhấnF9để gửi signal killlà system call dùng để gửi signal, còn/bin/killlà chương trình ở userland gọi system call đó- Signal mặc định là
TERMvà dùng để yêu cầu tiến trình kết thúc - Signal là các giá trị số; tên thường được viết hoa và có thể có tiền tố
SIG - Ví dụ:
INT,KILL,STOP,CONT,HUP kill -INT 10089,kill -2 10089,/bin/kill -2 10089đều cho cùng một hành vi- Khi nhấn
CTRL+C,bashsẽ gửiSIGINTtới foreground process - Gửi
SIGINThoặcSIGTERMkhông có nghĩa là tiến trình chắc chắn sẽ kết thúc - Chương trình có thể thiết lập signal handler để xử lý, chẳng hạn dọn dẹp rồi mới thoát
SIGKILLhoặc9sẽ khiến kernel buộc tiến trình kết thúc mà không cho nó cơ hội phản hồi
- Ở trạng thái
-
D: Sleep không thể bị ngắt
- Trạng thái
Dkhông thể được đánh thức bằng signal, và vìSIGKILLcũng là một signal nên cũng không thể kill các tiến trình này - Trạng thái này được dùng khi tiến trình phải chờ mà không được gián đoạn hoặc khi dự kiến sự kiện sẽ xảy ra nhanh
- Ví dụ: đọc/ghi đĩa
- Một uninterruptible process thường có thể đang chờ I/O sau page fault
- Trạng thái này có thể xuất hiện khi đọc hoặc ghi NFS bị chậm
- Nó cũng có thể xuất hiện khi bộ nhớ khả dụng quá ít khiến tiến trình phải swap nhiều
- Ví dụ, chạy
sudo mount 8.8.8.8:/tmp /tmp &thì/sbin/mount.nfssẽ vào trạng tháiD - Nếu xem bằng
strace, sẽ thấy system callmountđang block tiến trình - Có thể dùng tùy chọn
intrchomountđể chạy theo cách có thể bị ngắt sudo mount 8.8.8.8:/tmp /tmp -o intr
- Trạng thái
-
Z: Tiến trình zombie
- Trạng thái
Zlà khi tiến trình đã kết thúc nhưng parent vẫn chưa reap nó - Tiến trình zombie tồn tại trong thời gian ngắn có thể là bình thường
- Zombie tồn tại lâu có thể cho thấy lỗi trong chương trình
- Tiến trình zombie không tiêu thụ bộ nhớ mà chỉ chiếm PID
- Bản thân tiến trình zombie không thể bị
kill - Có thể gửi
SIGCHLDtới parent process để yêu cầu nó reap zombie - Nếu kill parent process thì có thể loại bỏ cả parent lẫn zombie của nó
- Có thể tái hiện trạng thái zombie bằng một chương trình C trong đó child
exit(0)saufork, còn parent thìsleep(20) - Khi parent kết thúc, zombie sẽ biến mất
- Zombie được giữ lại vì parent cần có thể kiểm tra exit code của child bằng system call
wait
- Trạng thái
-
T và t: Tiến trình bị dừng
- Trạng thái
Tlà trạng thái bị dừng bởi job control signal - Khi đang chạy
cat /dev/urandom > /dev/null, nếu nhấnCTRL+Zthì nó sẽ vào trạng tháiT - Có thể dùng
fgđể chạy lại - Cũng có thể dừng bằng signal
STOPvà tiếp tục bằng signalCONT - Trạng thái
tlà trạng thái bị debugger dừng trong lúc tracing - Nếu attach
sudo gdb -p <pid>vào tiến trình chạy bằngnc -l 1234 &thì nó sẽ vào trạng tháit
- Trạng thái
Thời gian CPU, niceness, priority
- Linux là hệ điều hành đa nhiệm nên ngay cả trên một CPU đơn, nhiều tiến trình vẫn có vẻ như đang chạy đồng thời
- Trên thực tế, một CPU đơn chỉ có thể thực thi một lệnh tại một thời điểm, vì vậy hệ thống dùng time sharing
- Một tiến trình chạy trong chốc lát rồi bị tạm dừng
- Các tiến trình khác đang chờ chạy sẽ lần lượt được thực thi
- Khoảng thời gian ngắn mà một tiến trình được chạy được gọi là time slice
- Time slice thường chỉ vài mili giây nên nếu load của hệ thống không cao thì khó cảm nhận được
- Trên hệ thống đơn lõi, nếu load average là
1.0thì có thể xem như CPU đã được sử dụng 100%- Nếu cao hơn
1.0thì số tiến trình muốn chạy nhiều hơn khả năng xử lý của CPU, có thể gây slowdown hoặc delay - Nếu thấp hơn
1.0thì CPU đôi lúc ở trạng thái idle
- Nếu cao hơn
- Việc running time của tiến trình có thể không khớp chính xác với thời gian thực tế đã trôi qua cũng được giải thích bằng cơ chế time sharing
- Khi số task cần chạy nhiều hơn số lõi CPU có sẵn, hệ thống phải quyết định task nào sẽ được chạy trước
- Scheduler của nhân Linux chọn tiến trình tiếp theo từ run queue, và việc này phụ thuộc vào thuật toán scheduler của kernel
- Thông thường không thể điều khiển trực tiếp scheduler, nhưng có thể cho hệ thống biết tiến trình nào quan trọng hơn
- Niceness hiển thị bằng
NIlà mức ưu tiên ở user-space- Phạm vi từ
-20đến19 -20là ưu tiên cao nhất và19là ưu tiên thấp nhất- Có thể hiểu rằng tiến trình càng nice thì càng nhường nhiều hơn cho tiến trình kém nice hơn
- Phạm vi từ
PRIlà mức ưu tiên ở kernel-space mà nhân Linux sử dụng- Phạm vi từ
0đến139 0~99là real time,100~139là dải dành cho user
- Phạm vi từ
- Mối quan hệ giữa giá trị nice và priority được mô tả bằng
PR = 20 + NINItừ-20~+19trở thànhPRtừ0~39, rồi được ánh xạ vào100~139
- Trước khi chạy, có thể đặt niceness bằng
nice -n niceness program - Có thể đổi niceness của tiến trình đang chạy bằng
renice -n niceness -p PID - Màu của mức sử dụng CPU như sau
- Blue: thread ưu tiên thấp,
nice > 0 - Green: thread ưu tiên thông thường
- Red: kernel thread
- Blue: thread ưu tiên thấp,
Chỉ số bộ nhớ: VIRT, RES, SHR, MEM%
- Tiến trình trông như thể nó tồn tại riêng trong bộ nhớ, và điều này được hiện thực bằng bộ nhớ ảo
- Tiến trình không truy cập trực tiếp bộ nhớ vật lý mà có virtual address space riêng
- Kernel có thể chuyển đổi địa chỉ virtual memory sang bộ nhớ vật lý hoặc ánh xạ một phần ra disk
- Vì vậy, tiến trình có thể trông như đang dùng nhiều bộ nhớ hơn cả dung lượng bộ nhớ cài trên máy
- Mức sử dụng bộ nhớ của tiến trình sẽ khác nhau tùy theo việc có tính các mục sau hay không
- shared library
- bộ nhớ được ánh xạ với disk
- bộ nhớ đã bị swap out
- Màu của mức sử dụng bộ nhớ như sau
- Green: bộ nhớ đang dùng
- Blue: buffers
- Orange: cache
-
VIRT/VSZ
VIRTlà tổng lượng virtual memory mà task đang dùng- Bao gồm code, data, shared library, page đã swap out, và page đã được ánh xạ nhưng chưa dùng
- Ngay cả khi ứng dụng yêu cầu 1GB nhưng chỉ dùng 1MB thì
VIRTvẫn có thể hiện là 1GB - Ngay cả khi
mmapmột file 1GB nhưng không thực sự dùng,VIRTvẫn có thể hiển thị là 1GB - Trong đa số trường hợp,
VIRTkhông phải là con số hữu ích
-
RES/RSS
RESlà lượng bộ nhớ vật lý chưa bị swap out, tức lượng resident memory hiện đang nằm trong bộ nhớ vật lýREScó thể phản ánh mức dùng bộ nhớ thực tế tốt hơnVIRT, nhưng vẫn có giới hạn- Không bao gồm bộ nhớ đã bị swap out
- Một phần bộ nhớ có thể được chia sẻ với các tiến trình khác
- Nếu một tiến trình dùng 1GB bộ nhớ rồi
fork(),REScủa mỗi tiến trình có thể đều hiện là 1GB, nhưng do cơ chế copy-on-write của Linux nên trên thực tế có thể chỉ dùng 1GB
-
SHR
SHRlà lượng shared memory mà task đang dùng- Phản ánh phần bộ nhớ có thể được chia sẻ với các tiến trình khác
- Chương trình C minh họa cho thấy
VIRT,RES,SHRthay đổi ra sao khi đi qua các bướcmalloc, sử dụng một phần bộ nhớ,fork, rồi ghi thêm vào bộ nhớ - Phần ví dụ bộ nhớ đó hiện vẫn được để TODO
-
MEM%
MEM%là tỷ lệ bộ nhớ vật lý khả dụng mà task hiện đang sử dụng- Đây là giá trị
RESchia cho tổng RAM - Ví dụ: nếu
RESlà400Mvà RAM là 8GB thì400/8192*100 = 4.88%
Các tiến trình mặc định của Ubuntu Server 16.04
-
Khảo sát các tiến trình được khởi động trên Ubuntu Server 16.04.1 LTS x64 của một droplet Digital Ocean mới tạo
-
/sbin/init/sbin/initđiều phối phần còn lại của boot process và thiết lập môi trường người dùng- Trở thành parent hoặc grandparent của các tiến trình tự khởi động
- Kết quả
dpkg -S /sbin/initlàsystemd-sysv: /sbin/init, nên trên hệ thống này đó là systemd - Kể cả kill thì cũng không có gì xảy ra
-
/lib/systemd/systemd-journaldsystemd-journaldlà một system service thu thập và lưu trữ logging data- Tạo và duy trì journal có cấu trúc, được lập chỉ mục dựa trên thông tin log nhận từ nhiều source
- Dùng định dạng tệp đặc biệt tối ưu cho log message thay vì các file log văn bản thuần túy đơn giản
- Tra cứu bằng
journalctl journalctl _COMM=sshdjournalctl _COMM=sshd -o json-prettyjournalctl --since yesterdayjournalctl -bjournalctl -fjournalctl --disk-usagejournalctl --vacuum-size=1G- Có vẻ không thể gỡ bỏ hoặc vô hiệu hóa, chỉ có thể tắt logging
-
/sbin/lvmetad -flvmetadcache LVM metadata để các lệnh LVM có thể đọc metadata mà không cần disk scan- Disk scan tốn thời gian và có thể cản trở hoạt động bình thường của hệ thống và disk
- LVM có thể xem như các “dynamic partitions” cho phép Linux tạo, resize và xóa logical volume khi đang chạy
- Nếu đang dùng LVM thì nên giữ lại
-
/lib/systemd/udevdsystemd-udevdlắng nghe kernel uevent và với mỗi event sẽ thực thi chỉ thị khớp trong udev rules- udev là device manager của Linux kernel và chủ yếu quản lý các device node trong thư mục
/dev - Chưa chắc nó có cần thiết trên virtual server hay không
-
/lib/systemd/timesyncdsystemd-timesyncdlà một system service đồng bộ local system clock với remote NTP server- Thay thế
ntpd - Trên hệ thống ví dụ,
timedatectl statushiển thị network time và NTP synchronized làyes - Trong đầu ra
netstatchỉ thấy SSH port ở trạng thái listening, không mở nhiều UDP 123 port nhưntpdtrên Ubuntu 14.04
-
/usr/sbin/atd -fatdthực thi các job đã được đưa vào queue để chạy sau nàyatvàbatchđọc lệnh từ stdin hoặc từ file để chạy sau- Khác với cron dùng để lên lịch chạy lặp lại,
atchạy một lần vào thời điểm cụ thể - Trong ví dụ,
echo "touch /tmp/yolo.txt" | at now + 1 minutetạo file sau 1 phút - Nếu không dùng thì gỡ bằng
sudo apt remove at -y --purge
-
/usr/lib/snapd/snapd- Snappy Ubuntu Core được giới thiệu là một rendition của Ubuntu dùng transactional update
- snap được mô tả là universal Linux package format cho phép một binary package chạy trên Linux desktop, server, cloud và device
- Có thể hiểu như một deb package được đơn giản hóa, gói dependency vào một single snap để phân phối
- Vì chưa từng deploy hay distribute ứng dụng bằng snappy trên server nên đã gỡ bằng
sudo apt remove snapd -y --purge
-
/usr/bin/dbus-daemon- D-Bus là cơ chế IPC và RPC giữa nhiều process cùng chạy đồng thời trên một machine
- Nó cần cho desktop environment, nhưng có nghi vấn liệu có cần trên server chạy web app hay không
- Khi gỡ
dbus,timedatectl statusthất bại vớiFailed to create bus connection: No such file or directory - Vì vậy tốt hơn là nên giữ lại
-
/lib/systemd/systemd-logindsystemd-logindlà system service quản lý user login
-
/usr/sbin/cron -fcronlà daemon thực thi các lệnh theo lịch-fnghĩa là foreground mode, không daemonize- Các tác vụ cần chạy định kỳ có thể lên lịch bằng cron
crontab -e- Trên Ubuntu thường dùng
/etc/cron.hourly,/etc/cron.dailyv.v. - Có thể xem log theo cách sau
grep cron /var/log/syslogjournalctl _COMM=cronjournalctl _COMM=cron --since="date" --until="date"- Khả năng cao là sẽ giữ cron
- Nếu không gỡ thì có thể dừng và vô hiệu hóa bằng
sudo systemctl stop cron,sudo systemctl disable cron apt remove croncó thể sẽ cố cài postfix v.v.- Vì cron suggest mail transport agent
-
/usr/sbin/rsyslogd -nrsyslogdlà system utility hỗ trợ message logging- Nó có vai trò điền dữ liệu vào các file log trong
/var/log/như/var/log/auth.log - File cấu hình nằm trong
/etc/rsyslog.d - Có thể gửi log tới remote server để xây dựng centralized logging
- Có thể dùng lệnh
loggerđể ghi message vào/var/log/syslogtừ background script - Dù đã có
systemd-journald, rsyslog và journal có những đặc tính khác nhau nên có những trường hợp dùng cùng nhau sẽ hữu ích - Vì vậy tạm thời giữ lại
-
/usr/sbin/acpidacpidlà ACPI event daemon- Được thiết kế để thông báo ACPI event cho user-space program
- ACPI được dùng cho hardware component discovery/configuration, power management, status monitoring v.v.
- Vì không định suspend/resume trên virtual server nên đã thử gỡ
rebootthành công nhưng sauhalt, Digital Ocean vẫn nhận là máy còn bật nên phải Power Off từ web interface- Do đó kết luận là nên giữ lại
-
/usr/bin/lxcfs /var/lib/lxcfs/lxcfslà FUSE filesystem được thiết kế cho LXC container- Cung cấp virtualized view cho một số file trong
/procvà filtered access tới host cgroup filesystem - Giúp uptime, top v.v. trong container cho kết quả “đúng” hơn
- Nếu không dùng LXC container thì có thể gỡ bằng
sudo apt remove lxcfs -y --purge
-
/usr/lib/accountservice/accounts-daemon- AccountsService cung cấp D-Bus interface và phần triển khai để query và thao tác thông tin user account
- Phần triển khai dựa trên các lệnh
usermod(8),useradd(8),userdel(8)
-
Sau khi gỡ bỏ thì những gì sẽ bị hỏng vẫn được để ngỏ là “Time will tell”
-
/sbin/mdadmmdadmlà tiện ích Linux dùng để quản lý và giám sát software RAID device- RAID là cách sử dụng nhiều hard drive như thể chúng là một
- RAID 0 mở rộng dung lượng drive
- RAID 1, RAID 5, RAID 6, RAID 10 nhằm ngăn mất dữ liệu khi drive bị lỗi
- Có thể gỡ bằng
sudo apt remove mdadm -y --purge
-
/usr/lib/policykit-1/polkitd --no-debugpolkitdlà daemon của PolicyKit, còn polkit là Authorization Framework- Có thể hiểu như một sudo chi tiết theo quyền
- Có thể cấp cho user không đặc quyền quyền thực hiện một số action nhất định với quyền root
- Ví dụ: cho phép reboot trên desktop Linux
- Tác giả tổng kết rằng trên server có thể gỡ bằng
sudo apt remove policykit-1 -y --purge - Những gì sẽ bị hỏng vẫn còn là một câu hỏi bỏ ngỏ
-
/usr/sbin/sshd -Dsshdlà OpenSSH Daemon- Tùy chọn
-Dkhiến nó không detach và không chạy thành daemon, giúp việc monitoring dễ hơn
-
/sbin/iscsidiscsidlà background daemon hoạt động theo cấu hình iSCSI và quản lý các connection- iSCSI là tiêu chuẩn storage networking dựa trên IP, truyền SCSI command qua IP network để có thể dùng remote storage như local disk
- Có thể gỡ bằng
sudo apt remove open-iscsi -y --purge
-
/sbin/agetty --noclear tty1 linuxagettylà một getty thay thế trên Linux- getty quản lý terminal vật lý hoặc ảo, và khi phát hiện kết nối thì hiển thị username prompt rồi chạy chương trình
login - Trên Digital Ocean, có thể tương tác với terminal này trong trình duyệt thông qua
Consoleở phần chi tiết droplet - Sau khi gỡ các file liên quan đến
getty@tty1.servicevà reboot, vẫn có thể SSH vào nhưng không thể đăng nhập bằng web console của Digital Ocean
-
Phiên SSH, bash, htop
sshd: root@pts/0nghĩa là phiên SSH của userrootđược thiết lập trên pseudoterminalpts/0- pseudoterminal mô phỏng một text terminal thực
bashlà shell đang được sử dụng- Nếu có dấu gạch ở đầu như
-bashthì nó được khởi động như một login shell - Shell có ký tự đầu tiên của argument zero là
-hoặc được khởi động với tùy chọn--loginlà login shell - Trong trường hợp này, nó sẽ đọc một bộ configuration file khác
htoplà trình xem process tương tác đang chạy trong ảnh chụp màn hình
Thử nghiệm gỡ bỏ dịch vụ
- Danh sách gỡ bỏ thông thường như sau
sudo apt remove lvm2 -y --purgesudo apt remove at -y --purgesudo apt remove snapd -y --purgesudo apt remove lxcfs -y --purgesudo apt remove mdadm -y --purgesudo apt remove open-iscsi -y --purgesudo apt remove accountsservice -y --purgesudo apt remove policykit-1 -y --purge
- Bản Extreme bao gồm các thao tác sau
sudo apt remove dbus -y --purgesudo apt remove rsyslog -y --purgesudo apt remove acpid -y --purgesudo systemctl stop cron && sudo systemctl disable cronsudo rm /etc/systemd/system/getty.target.wants/getty@tty1.servicesudo rm /lib/systemd/system/getty@.service
- Cấu hình nginx, PHP7, MySQL theo hướng dẫn unattended installation of WordPress on Ubuntu Server vẫn hoạt động
Phụ lục: Công cụ khảo sát và hoạt động của shell
-
Tìm mã nguồn
- Khi chỉ
stracelà chưa đủ thì có thể xem mã nguồn - Dùng
which uptimeđể tìm vị trí binary, rồi dùngdpkg -S /usr/bin/uptimeđể tìm package Ubuntu - Trong ví dụ,
uptimethuộc packageprocps - Có thể tìm package trên packages.ubuntu.com và tìm link tới source repository
- Khi chỉ
-
File descriptor và redirection
- Khi redirect stderr sang stdout thì dùng
2>&1 echo something > filelà ghi stdout vào file, tương đươngecho something 1> fileecho something 2> filelà ghi stderr vào fileecho something 2>1có nghĩa là redirect stderr vào filename1- Trong
2>&1có dấu&, số1không phải filename mà là stream ID
- Khi redirect stderr sang stdout thì dùng
-
Vấn đề màu sắc của PuTTY
- Nếu các thành phần của
htophiển thị như bị thiếu trong PuTTY thì có thể xử lý trong phần thiết lập Window → Colours - Nhấp chuột phải vào thanh tiêu đề
- Change settings...
- Window → Colours
- Chọn nút radio Both
- Apply
- Nếu các thành phần của
-
Shell đơn giản viết bằng C
- Một shell đơn giản viết bằng C cho thấy cách dùng các system call
fork,exec,wait - Nếu input là
exitthì thoát bằng shell built-in - Các lệnh khác sẽ
fork, sau đó child thực thi bằngexeclp, còn parent chờ trạng thái kết thúc bằngwaitpid - Ví dụ chạy
date,true,falsesẽ lần lượt in ra exit code của child - Lý do thông báo kết thúc của background process như
sleep 1 &chỉ hiện ra sau khi nhấn Enter là vì shell đang chờ input, rồi chỉ kiểm tra trạng thái background process khi có lệnh được nhập
- Một shell đơn giản viết bằng C cho thấy cách dùng các system call
Các mục cần khảo sát thêm và lịch sử chỉnh sửa
- Các mục muốn tìm hiểu thêm gồm process state substatus, kernel thread,
/dev/pts, bộ nhớCODE·DATA·SWAP, độ dài time slice, thuật toán scheduler của Linux, core pinning, manual page, màu của thanh CPU/memory, process ID limit và fork bomb,lsof,ionice,schedtoolv.v. - Các chỉnh sửa/cập nhật chính gồm những mục sau
- idle time của
/proc/uptimelà tổng cộng của tất cả các core - Đã sửa
printfcủa parent/child trong ví dụ zombie C - Đã bổ sung việc
apt remove cronsẽ cố càipostfixdo dependency của MTA idcó thể tải thông tin không chỉ từ/etc/passwdmà còn từ nguồn khác thông qua/etc/nsswitch.conf- Đã bổ sung giải thích về password hash format của
/etc/shadow /etc/sudoerscần được chỉnh sửa an toàn bằngvisudo- Đã bổ sung giải thích về
MEM% - Phần load average đã được viết lại
- Đã sửa signal mặc định của
kill 1234từINTthànhTERM - Đã bổ sung giải thích về thanh màu CPU và memory
- idle time của
1 bình luận
Ý kiến trên Hacker News
Gần đây tôi đã chuyển sang btop, vì nó có giao diện hiện đại và hữu ích vừa đủ, đồng thời lượng thông tin cũng khá đầy đủ
Có vẻ như nó cũng hiển thị mức tiêu thụ điện năng (Watts) như những người khác đã nói, và còn kèm cả thông tin mạng, GPU, ổ đĩa
https://github.com/aristocratos/btop
Không thể tắt thanh mức sử dụng đĩa, nên nếu cửa sổ console không đủ lớn thì biểu đồ tốc độ I/O trông sẽ bị ép rất nhiều
Biểu đồ CPU/GPU đang chiếm quá nhiều diện tích, và nhìn chung tôi muốn bảng file đang mở chiếm nhiều không gian hơn
Có 2 thiết lập mà tôi luôn đổi mỗi khi dùng htop, và khác biệt là rất lớn
Thứ nhất, tôi tắt luồng người dùng. Phần lớn chúng chỉ làm màn hình htop rối thêm mà hầu như không cho thông tin hữu ích
Thứ hai, tôi bật chế độ xem cây tiến trình. Nhiều khi biết tiến trình bắt đầu từ đâu còn quan trọng hơn các thông tin khác, và cũng dễ lần theo những tiến trình như compiler xử lý nhiều file rồi ngốn CPU
Cá nhân tôi thấy cả hai nên là hành vi mặc định của htop
Tôi rất vui khi thấy phần giải thích rằng bộ nhớ ảo khó mà tin cậy được. Cách Windows Task Manager hiển thị mặc định theo hướng đó thì thật sự tệ
Kích thước tập thường trú (RSS) là chỉ số đáng tin nhất, còn các giá trị khác có thể bị phình sai vì những thứ như file ánh xạ bộ nhớ mà thực ra không gây vấn đề gì
Ví dụ, dù bạn ánh xạ một file log 2GB vào bộ nhớ, phần đó chỉ được nạp thành trang khi đọc tới, nên thực tế không phải là đang dùng lượng RAM ấy, nhưng người dùng nhìn tiến trình rồi sẽ hỏi “sao ứng dụng này dùng nhiều bộ nhớ thế”
Chrome cũng từng gặp vấn đề này một thời gian và đã giảm việc dùng file ánh xạ bộ nhớ, không phải vì file ánh xạ bộ nhớ là xấu mà vì người dùng phản ứng quá mức khi nhìn vào những con số không phản ánh mức dùng bộ nhớ vật lý thực tế
Trên web cũng có cả hướng dẫn bảo nên đánh giá mức dùng theo lượng cấp phát bộ nhớ ảo, nhưng ít nhất bài này đã chỉ ra đúng điểm đó
Tham khảo: https://en.wikipedia.org/wiki/Proportional_set_size
Nếu dùng I/O file thông thường thì sẽ không bị tính. Trên các cụm HPC nơi người ta giám sát mức dùng bộ nhớ của từng job rồi kill nếu vượt yêu cầu, điều này tạo ra những kết quả khá thú vị
Khi bắt đầu có áp lực bộ nhớ, nó không còn mang tính đại diện nữa. Tôi đã thấy vài quyết định sai vì hiểu nhầm này, và từng phải loại hẳn giá trị đó khỏi biểu đồ để ngăn đồng đội kết luận ngược
Đúng như tên gọi, nó chỉ hiển thị phần được ánh xạ vào bộ nhớ vật lý được cấp riêng cho từng tiến trình, nên gần với Resident Set trên Unix hơn
Có lẽ ý ở đây là mức dùng bộ nhớ trong tab hiệu năng, nhưng tôi phân biệt ra để tránh bị hiểu nhầm là nói về mọi mục mức dùng bộ nhớ
Trong top, dùng ký tự
>sẽ sắp xếp theo mức dùng bộ nhớTôi thỉnh thoảng dùng khi tìm nguyên nhân máy chủ bị chậm, và cũng có thể thấy
swapdđang ngốn CPUMcho bộ nhớ và chữ hoaPcho CPU hơnMỗi lần đọc những bài như thế này, tôi lại nhận ra rằng dù đã dùng Linux hằng ngày hơn 20 năm, mình vẫn chỉ mới khai thác một phần tiềm năng của nó. Bài viết rất hay
Có cảm giác HN đang hồi phục trở lại
Mong là đây không phải thời kỳ bóng ma lững thững của HN
Nếu ai chưa biết
nmonthì cũng đáng thử xemNhấn
hsẽ hiện danh sách các màn hình giám sát có thể dùng, nhấn lại sẽ ẩn đi, vàqđể thoáthttps://nmon.sourceforge.io/pmwiki.php
Đặc biệt, thông lượng đĩa và I/O xem bằng phím
dvàDkhá hữu íchBiểu đồ mức dùng CPU dạng rộng rất tốt cho việc hiển thị số lượng lõi lớn một cách dễ hiểu
Với cách dùng khác với dòng
*top, tôi ngày càng thích kiểu báo cáo chênh lệch điềm tĩnh theo phong cáchpsvà kiểu báo cáo toàn hệ thống nhưvmstathơnLàm vậy thì mọi thứ đều được giữ lại trong buffer cuộn của terminal: https://github.com/c-blake/procs
Nó được viết bằng Nim, một ngôn ngữ hiếm khi không vừa hiệu quả vừa giàu khả năng biểu đạt
Tôi đã bookmark bài này từ năm 2016 và trong nhiều năm qua đã quay lại tham khảo nó nhiều lần