2012-04-12 33 views
9

tôi nhìn thấy một vài trong số những sai sót trong quá thời gian tải cao:nguồn Mysql tạm thời không có

mysql_connect() [<a 
href='function.mysql-connect'>function.mysql-connect</a>]: [2002] Resource 
temporarily unavailable (trying to connect via 
unix:///var/lib/mysql/mysql.sock) 

Từ những gì tôi có thể nói server mysql không tăng trần kết nối tối đa của nó, nhưng có điều gì đó khác dừng nó phục vụ truy vấn. MySQL sẽ giới hạn những giới hạn nào khác?

Tôi đang chạy RHEL 6.2 64bit với MySQL 5.5.21

+0

Nó có thể là một lỗi trong máy chủ mysql? Nó cũng có thể là kết quả của cách máy chủ mysql xử lý các yêu cầu có vấn đề với khối lượng lớn, chẳng hạn như khi các yêu cầu gần như đồng thời theo một số biện pháp đồng hồ. –

+0

bạn có đang sử dụng lại các kết nối hoặc chỉ mở các kết nối mới không? mà không có một số mã khó có thể đoán được điều gì là sai. – stevebot

+0

Kết nối không liên tục trên các yêu cầu php. Tôi đọc một nơi nào đó về mysql chạy ra khỏi mô tả tập tin, nhưng tôi không chắc chắn làm thế nào để kiểm tra điều đó. – Noodles

Trả lời

2

Tôi vẫn chưa tìm thấy giới hạn nào được nhấn, nhưng tôi đã cố gắng giải quyết vấn đề. Đã xảy ra sự cố với bảng phiên của chúng tôi (trong vbulletin) sử dụng công cụ MEMORY. Các chỉ mục cho bảng này là HASH và do đó khi vbulletin dọn dẹp bảng này mỗi giờ một lần, nó sẽ khóa bảng chỉ đủ lâu để giữ các truy vấn khác và đẩy mysql đến giới hạn tài nguyên của nó.

Bằng cách thay đổi chỉ mục thành BTREE, điều này cho phép MySQL xóa các hàng khỏi bảng phiên nhanh hơn và tránh bất kỳ giới hạn nào đã đạt đến trước đó. Các lỗi chỉ bắt đầu khi chúng tôi nâng cấp máy chủ db chủ của mình lên MySQL 5.5, vì vậy tôi đoán các bảng MEMORY được xử lý khác nhau trong bản phát hành mới nhất.

Xem http://www.mysqlperformanceblog.com/2008/02/01/performance-gotcha-of-mysql-memory-tables/ để biết thông tin về tăng tốc từ việc sử dụng chỉ mục BTREE trên HASH For MEMORY.

21

Giả sử hệ thống của bạn hiện đang dựa trên Unix (như được đưa ra trong báo cáo vấn đề của bạn). Nếu điều này đúng, đây là tập hợp các vấn đề bạn có thể gặp phải:

  1. Bạn đã hết số memory có sẵn cho MySQL.

    Đây là vấn đề rất có thể bạn đang gặp phải. Mỗi kết nối trong nhóm kết nối của MySQL yêu cầu bộ nhớ hoạt động và nếu tài nguyên này cạn kiệt, không thể thực hiện thêm kết nối nào. Tất nhiên, các dấu chân bộ nhớ và kích thước gói tối đa của các hoạt động khác nhau có thể được điều chỉnh trong your equivalent to my.cnf nếu bạn phát hiện ra đây là một vấn đề.

    Here's an additional thread that can help there, nhưng bạn cũng có thể cân nhắc sử dụng các công cụ lược tả đơn giản hơn như top để có ước tính tốt về những gì đang xảy ra.

  2. Bạn đã hết số file descriptors khả dụng cho tài khoản người dùng MySQL của mình.

    Một vấn đề phổ biến khác: nếu bạn đang cố gắng yêu cầu dịch vụ yêu cầu tệp IO phía trên ranh giới 1.024 (theo mặc định), bạn sẽ gặp phải trường hợp thao tác đơn giản không thành công. Điều này là do hầu hết các hệ thống chỉ định giới hạn mềm và cứng về số lượng mô tả tệp mở mà mỗi người dùng có thể có sẵn cùng một lúc và việc đi bộ qua ngưỡng này có thể gây ra sự cố.

    Điều này thường sẽ có một loạt các dấu hiệu rõ ràng hiển thị trong tệp nhật ký của bạn. Kiểm tra /var/log/messages và thư mục có thể so sánh của bạn (ví dụ, /var/log/mysql để xem nếu bạn có thể tìm thấy bất cứ điều gì thú vị.

  3. Bạn đã chạy vào một kịch bản livelock or deadlock nơi chủ đề của bạn là không thể thoả mãn.

    luỵ vào bộ nhớ và mô tả file kiệt sức , các chủ đề có thể hết thời gian nếu bạn đã vượt quá tải tính toán mà hệ thống của bạn có khả năng xử lý. Nó sẽ không ném thông báo lỗi này, nhưng đây là điều cần chú ý trong tương lai.

  4. Hệ thống của bạn đang chạy trong số PID có sẵn cho fork.

    Một trường hợp phổ biến khác: fork chỉ có rất nhiều PID có sẵn để sử dụng tại bất kỳ thời điểm nào. Nếu hệ thống của bạn chỉ đơn giản là overforked, hệ thống sẽ ngừng cung cấp các yêu cầu dịch vụ.

    Kiểm tra đơn giản nhất cho điều này là xem liệu có bất kỳ dịch vụ nào khác có thể kết nối với máy không. Ví dụ, cố gắng để SSH vào hộp và phát hiện ra rằng bạn không thể là một đầu mối lớn.

  5. Trình quản lý kết nối hoặc proxy ngược dòng đã hết nguồn lực và ngừng yêu cầu dịch vụ.

    Nếu bạn có bất kỳ lớp dịch vụ nào giữa máy khách và MySQL của bạn, nó sẽ kiểm tra xem nó đã bị treo, treo hay không ổn định. Lời khuyên trên được áp dụng.

  6. Trình ánh xạ cổng của bạn đã cạn kiệt chính nó after 65,536 connections.

    Không chắc chắn, nhưng một lần nữa, một trường hợp hết sức có thể xảy ra. Kiểm tra kết nối dịch vụ tầm thường như trên, ehm, cũng là cổng gọi tốt nhất ở đây.

Ngắn gọn: đây là tình huống cạn kiệt tài nguyên, bao gồm máy chủ đơn giản là "hỏng". Bạn sẽ phải lập hồ sơ hệ thống của mình hơn nữa để xem những gì bạn đang chặn. Tất cả các thông báo lỗi cho chúng ta trong trường hợp này là thực tế tài nguyên không có sẵn cho khách hàng - chúng tôi cần xem thêm thông tin về máy chủ để xác định biện pháp khắc phục phù hợp hơn.

+0

Cảm ơn, rất hữu ích, nhưng bạn có thể chỉ cho tôi đúng nơi để kiểm tra cho từng điều này không?Tôi nghi ngờ tôi đã hết bộ nhớ (12GB bộ nhớ trong mỗi máy chủ của chúng tôi), nhưng tôi cần phải nhìn vào những người khác. – Noodles

+1

@Noodles Sẽ làm. Tôi cần phải xử lý một số thứ ở đầu của tôi trước, nhưng tôi sẽ quay lại để kéo thêm một chút tài liệu vào câu trả lời của tôi hy vọng trong vòng một giờ tới. :) – MrGomez

+1

Câu trả lời của tôi đã được cập nhật. Ước tính thời gian của tôi giảm một chút, nhưng điều đó là đủ để giúp khắc phục sự cố. Nếu bạn cần thêm lời khuyên cụ thể, hợp lý, hãy cho tôi biết. Tôi sẽ sẵn lòng làm cho bản thân mình sẵn sàng thông qua trò chuyện SO. – MrGomez

1

Geez, điều này có thể rất nhiều thứ. Có thể là không gian bộ đệm ổ cắm bị cạn kiệt. Có thể là mysql không chấp nhận các kết nối nhanh như chúng sắp tới và giới hạn tồn đọng được đạt tới (mặc dù tôi hy vọng rằng sẽ cung cấp cho bạn lỗi "Bị từ chối kết nối", tôi không biết chắc chắn đó là những gì bạn ' sẽ nhận được cho một ổ cắm miền Unix). Nó có thể là bất kỳ thứ gì @MrGomez chỉ ra.

Vì bạn đang chạy Apache và MySQL trên cùng một máy chủ và đây là vấn đề với tải trọng cao, có thể Apache đang bỏ đói hệ thống tài nguyên và bạn không thấy (chú ý?)/các kết nối/yêu cầu đến không thành công trong nhật ký của bạn.

Bạn có đang sử dụng tính năng tổng hợp kết nối không? Nếu không, tôi sẽ bắt đầu ở đó.

Tôi cũng sẽ tìm lỗi trong nhật ký Apache và nhật ký hệ thống xung quanh cùng lúc với lỗi mysql_connect và xem những gì khác sẽ xảy ra. Tôi đặc biệt khuyên bạn nên chuyển MySQL sang máy chủ riêng của mình.

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