2012-07-11 33 views
6

Sử dụng cùng một mã chính xác, phải mất khoảng 50ms mọi cuộc gọi đến một phương thức logger (chẳng hạn như logger.debug) trên máy chủ, trong khi trên máy dev nó nhỏ hơn 1ms. Các logger được xuất ra các tập tin, với một chút định dạng.Ghi nhật ký Python cực kỳ chậm trên máy chủ Linux ... nhưng nhanh trên máy phát triển Linux?

Khác với tốc độ chậm lại khi ghi nhật ký, máy chủ nhanh gấp hai lần.

Tôi đang phát triển trên Ubuntu 11.04 (Gnome) đang chạy bên trong VMWare trên Windows 7. Máy chủ đang chạy Ubuntu Server 11.04 (không có giao diện điều khiển thuần túy). Mô-đun ghi nhật ký là mô-đun "đăng nhập" chính thức ("nhập nhật ký ... logger = logging.getLogger ('mylogger')").

Bất kỳ ý tưởng nào có thể gây ra điều này? Nó cực kỳ bực bội!

Cảm ơn bạn đã trợ giúp!

EDIT: Cả hai máy trả về "Python 2.7.1+" cho phiên bản của chúng. Cả hai máy đang chạy Ubuntu 64 bit.

Cấu hình ổ cứng máy chủ là phần mềm RAID-1, trong khi trong máy tính dev chỉ một ổ đĩa.

EDIT2: Câu trả lời của Fabian được chấp nhận vì nó đã được xem xét kỹ lưỡng, mặc dù nó không giải quyết được vấn đề.

Giải pháp: Viết cho bảng điều khiển, khoảng thời gian, cực kỳ chậm. Tôi đã thử nghiệm viết X thành tệp và viết X lên bảng điều khiển và tốc độ chậm hơn 100 lần so với bảng điều khiển. Tôi không biết tại sao điều đó lại xảy ra, nhưng tôi chỉ chạy những gì tôi đang chạy với ssh từ một máy tính khác và mọi thứ đã được giải quyết.

+0

Bạn có thể đăng phiên bản của cả hai mã vạch –

+0

của python Bạn cũng có thể kiểm tra xem chính xác cùng một nhật ký đang được sử dụng trên cả hai máy. Gói ['logging_tree'] (http://pypi.python.org/pypi/logging_tree/1.1) sẽ hữu ích ở đây. –

+1

bạn có thể thử đăng nhập vào thiết bị xuất chuẩn và không phải để tập tin và kiểm tra xem tốc độ thay đổi. Có thể là một vấn đề với ổ đĩa cứng. –

Trả lời

6

Như đã lưu ý trong các nhận xét, lý do có thể là sự khác biệt về tốc độ đĩa giữa VM phát triển và máy sản xuất. Bạn có cùng loại ổ đĩa trong cả hai hệ thống, ví dụ như. SSD, SATA so với SCSI, tốc độ trục chính và bộ nhớ cache, v.v. Môi trường của bạn khá khác về mặt IO. Desktop Windows và VMWare sẽ sử dụng cache đĩa tích cực trong khi máy Linux sản xuất của bạn có khả năng bị lỗi ở bên an toàn và chờ dữ liệu được cam kết vào đĩa thường xuyên hơn. Có lẽ máy Windows có trình điều khiển phù hợp hơn với loại đĩa mà nó có, trong khi máy chủ đang chạy mà không cần tối ưu hóa? Sự khác biệt của hệ thống tệp cũng rất quan trọng và phần cứng có thể khác đủ để gây ra sự khác biệt đáng kể về tốc độ IO. Bạn cũng có thể có sự khác biệt lớn về tốc độ CPU và RAM. Máy tính để bàn ngày nay thường tập trung hơn vào tốc độ thô, trong khi phần cứng máy chủ sẽ tập trung nhiều hơn vào độ tin cậy. Bạn biết thiết lập của bạn tốt nhất, vì vậy bạn có thể so sánh hai hệ thống về hiệu suất phần cứng.

Ngoài ra, dưới đây là cách bạn có thể tìm hiểu những gì đang thực sự xảy ra:

Đầu tiên, hãy viết một MWe để kiểm tra khai thác gỗ. Bạn nên căn cứ trên mã thực của bạn, và sử dụng khai thác gỗ theo cách tương tự, nhưng đây là một ví dụ nhỏ:

import logging 

logging.basicConfig(filename="test.log", level=logging.DEBUG) 
logger = logging.getLogger("testlogger") 

for i in range(0, 1000000): 
    logger.info("iteration: %d", i) 

Sau đó chạy kịch bản dưới cProfile cả trong sự phát triển của bạn và máy sản xuất. Hãy nhớ đăng nhập vào cùng một hệ thống tệp như trong trường hợp sự cố của bạn, nếu không kết quả sẽ không được áp dụng.

python -m cProfile testlogging.py 

Bạn sẽ nhận ra rằng trông như thế này:

57000501 function calls in 137.072 seconds 

Ordered by: standard name 

ncalls tottime percall cumtime percall filename:lineno(function) 
    1 0.000 0.000 0.000 0.000 UserDict.py:4(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1044(_fixupParents) 
    1 0.000 0.000 0.000 0.000 __init__.py:1085(Logger) 
    2 0.000 0.000 0.000 0.000 __init__.py:1100(__init__) 
    1 0.000 0.000 0.000 0.000 __init__.py:1112(setLevel) 
..... ..... ..... ..... ..... ............................... 

này nên cung cấp cho bạn một ý tưởng về những gì đang gây ra sự chậm chạp trên máy sản xuất.Những điều cần tìm kiếm đặc biệt:

  • Tìm các dòng đọcvà {method 'flush' of 'file' objects}. Điều này sẽ cho bạn biết bao nhiêu thời gian Python đã dành để ghi vào các tập tin và xóa dữ liệu vào đĩa - trong trường hợp này, tệp nhật ký. Có sự khác biệt đáng kể giữa hai máy? Nếu vậy, nó chắc chắn là một sự khác biệt trong IO (đĩa) tốc độ. Sau đó, bạn nên xem xét thiết lập đĩa của máy chủ và xem liệu có bất kỳ điều gì bạn có thể làm để có được hiệu suất đĩa tốt hơn hay không.
  • Tìm các dòng có cột percall đầu tiên đặc biệt lớn. Cột này là tổng thời gian dành cho hàm chia cho số lượng cuộc gọi đến hàm đó. So sánh giữa hai máy và bạn có thể tìm thấy nguyên nhân gây ra sự khác biệt.
  • Tìm các dòng có cột tottime đặc biệt lớn. Cột này là tổng thời gian trong hàm. Một lần nữa, so sánh giữa hai máy, và bạn có thể tìm thấy một số lý do cho sự khác biệt tốc độ.

Nếu bạn thấy rằng đĩa IO có vẻ là vấn đề, bạn có thể thực hiện một thử nghiệm bổ sung chỉ bằng văn bản thô cho tệp. Bạn có thể tìm thấy một chương trình điểm chuẩn cho phép bạn kiểm tra thông lượng đĩa, nhưng bạn cũng có thể viết một chương trình C (hoặc Python) đơn giản ghi dữ liệu chưa định dạng vào một tệp để đảm bảo nó thực sự là hiệu năng đĩa tinh khiết, đó là sự khác biệt.

Chỉ cần một lưu ý cuối cùng: thử nghiệm hiệu suất, như lập trình, kết hợp nghệ thuật, khoa học và kỹ thuật, và trong khi có các mẫu và lời khuyên bạn có thể làm theo, mọi trường hợp cần một chút sáng tạo để bẻ khóa. Vì vậy, hãy thử mọi thứ, đảm bảo bạn không đánh lừa bản thân và vui chơi! Chúc may mắn!

Các vấn đề liên quan