Ngày càng nhiều nhà phát triển đang gặp phải các vấn đề hiệu suất nghiêm trọng khi làm việc với kho lưu trữ Git và các trình quản lý gói như pnpm trên macOS. Các vấn đề này dường như xuất phát từ cách hệ thống tệp APFS của Apple xử lý số lượng lớn các tệp nhỏ, tạo ra các điểm nghẽn có thể khiến các tác vụ phát triển thông thường trở nên chậm chạp một cách đau đớn.
Vấn đề đã trở nên đáng chú ý đến mức các nhà phát triển đã tạo ra các kho lưu trữ benchmark chuyên dụng để kiểm tra và ghi lại những vấn đề hiệu suất này. Các bài kiểm tra tập trung vào hai thao tác phổ biến mà các nhà phát triển thực hiện hàng ngày: dọn dẹp kho lưu trữ Git và cài đặt các phụ thuộc gói. Những thao tác này liên quan đến việc tạo, đọc và xóa hàng nghìn tệp nhỏ - chính xác là loại khối lượng công việc dường như kích hoạt các vấn đề hiệu suất của APFS.
Ảnh chụp nhanh Time Machine tạo ra chi phí bổ sung
Một trong những thủ phạm chính dường như là các ảnh chụp nhanh APFS được tạo bởi Time Machine. Mỗi khi hệ thống sao lưu chạy, nó tạo ra các ảnh chụp nhanh của toàn bộ hệ thống tệp, điều này thêm chi phí đáng kể cho các thao tác tệp. Điều này đặc biệt có vấn đề đối với các quy trình phát triển liên quan đến việc tạo và xóa tệp thường xuyên.
Hệ thống ảnh chụp nhanh tạo ra một cơn bão hoàn hảo của các vấn đề hiệu suất. Khi các nhà phát triển làm việc với kho lưu trữ Git hoặc cài đặt gói, họ đang tạo và xóa hàng nghìn tệp. Mỗi thao tác này phải được theo dõi bởi hệ thống ảnh chụp nhanh, tạo ra công việc bổ sung cho hệ thống tệp.
Ảnh chụp nhanh APFS: Một tính năng cho phép hệ thống tệp ghi lại trạng thái của các tệp tại một thời điểm cụ thể, được Time Machine sử dụng để sao lưu
Các thao tác I/O song song gặp khó khăn trên APFS
Một vấn đề đáng kể khác là cách APFS xử lý các thao tác đầu vào/đầu ra song song trên cùng một thư mục. Không giống như một số hệ thống tệp khác có thể quản lý hiệu quả nhiều tiến trình đọc và ghi tệp đồng thời, APFS dường như gặp khó khăn với khối lượng công việc này. Điều này tạo ra các điểm nghẽn khi các công cụ phát triển hiện đại cố gắng tăng tốc các thao tác bằng cách làm việc với nhiều tệp cùng một lúc.
Vấn đề đặc biệt nghiêm trọng vì cả Git và các trình quản lý gói như npm và pnpm đều được thiết kế để làm việc với nhiều tệp song song. Khi những công cụ này gặp phải các điểm nghẽn của hệ thống tệp, các lợi ích hiệu suất từ xử lý song song bị triệt tiêu hoàn toàn.
Các Yếu Tố So Sánh Hiệu Suất:
- Vấn Đề Của APFS: Chi phí overhead của snapshot, các nút thắt I/O song song, khóa thư mục
- Vấn Đề Của Windows: Bộ lọc hệ thống tệp, quét Windows Defender, tương thích tên tệp 8.3
- Ưu Điểm Của Linux: Xử lý I/O song song tốt hơn, ít hoạt động hệ thống tệp nền hơn
- Các Thao Tác Kiểm Tra: Dọn dẹp kho Git, cài đặt trình quản lý gói, thao tác tệp hàng loạt
Các giải pháp tạm thời mang lại kết quả hỗn hợp
Các nhà phát triển đã khám phá ra một số giải pháp tạm thời, mặc dù mỗi giải pháp đều có những đánh đổi. Một số loại trừ các thư mục phát triển của họ khỏi bản sao lưu Time Machine, điều này có thể cải thiện hiệu suất nhưng loại bỏ các tệp quan trọng khỏi bảo vệ sao lưu. Những người khác đã chuyển sang sử dụng máy ảo Linux hoặc container Docker, mặc dù cách tiếp cận này có thể tạo ra chi phí hiệu suất riêng.
Tôi loại trừ node_modules và các thư mục phụ thuộc khác khỏi bản sao lưu, nhưng các dự án khá nhiều là thứ chính tôi muốn. Tôi có thể có các kho lưu trữ trực tuyến, nhưng thường có các nhánh cục bộ mà tôi muốn được sao lưu tự động.
Giải pháp tạm thời cực đoan nhất liên quan đến việc sử dụng đĩa RAM hoặc các hệ thống tệp chuyên biệt trong máy ảo để bỏ qua APFS hoàn toàn. Mặc dù hiệu quả, những giải pháp này đòi hỏi kiến thức kỹ thuật đáng kể và có thể làm phức tạp các quy trình phát triển.
Các Giải Pháp Thay Thế Phổ Biến Cho Vấn Đề Hiệu Suất Hệ Thống Tệp macOS:
- Loại trừ các thư mục phát triển khỏi bản sao lưu Time Machine
- Sử dụng máy ảo Linux cho công việc phát triển
- Triển khai RAM disk cho các thao tác tệp tạm thời
- Sử dụng Docker với OverlayFS (mặc dù điều này có thể tạo ra overhead riêng)
- Cấu hình loại trừ phần mềm bảo mật cho các thư mục phát triển
Windows và Linux cho thấy hiệu suất tốt hơn
Các bài kiểm tra so sánh cho thấy rằng các thao tác tương tự trên hệ thống Windows và Linux hoàn thành nhanh hơn đáng kể so với trên macOS. Điều này cho thấy vấn đề cụ thể với cách macOS xử lý các thao tác hệ thống tệp thay vì là vấn đề với chính các công cụ phát triển.
Tuy nhiên, tình hình không hoàn toàn rõ ràng. Các hệ thống Windows cũng có thể gặp phải các vấn đề hiệu suất khi phần mềm bảo mật hoặc bộ lọc hệ thống tệp đang hoạt động. Sự khác biệt chính là những điều này thường có thể được cấu hình hoặc tạm thời vô hiệu hóa, trong khi các đặc tính hiệu suất của APFS được tích hợp sẵn vào chính hệ thống tệp.
Tác động rộng hơn đến việc phát triển
Những vấn đề hiệu suất này không chỉ là sự bất tiện - chúng đang ảnh hưởng đến năng suất của nhà phát triển theo những cách có thể đo lường được. Các thao tác đơn giản lẽ ra chỉ mất vài giây có thể kéo dài thành vài phút, và các bản build phức tạp hoặc cài đặt phụ thuộc có thể trở nên chậm một cách không thể chấp nhận được.
Vấn đề này làm nổi bật một căng thẳng rộng hơn giữa các thực hành phát triển hiện đại và thiết kế hệ thống tệp. Các công cụ phát triển ngày nay được tối ưu hóa để làm việc với hàng nghìn tệp nhỏ song song, nhưng các hệ thống tệp không nhất thiết được thiết kế với trường hợp sử dụng này là ưu tiên. Khi các quy trình phát triển tiếp tục phát triển, hiệu suất hệ thống tệp cho những khối lượng công việc cụ thể này trở nên ngày càng quan trọng.
Trình quản lý gói: Các công cụ như npm, pnpm và yarn tự động tải xuống và quản lý các phụ thuộc phần mềm cho các dự án phát triển
Tham khảo: disk-perf-git-and-pnpm