Cấu hình MySQL 5.1 InnoDB / RAM 24GB - tải cao bi-xeon


10

Tôi đang chạy một ứng dụng facebook hiện có 300 - 600 người dùng đồng thời (và đang phát triển). Để sẵn sàng cho phần cứng phát triển, tôi đã thay đổi i7 / 12gb ram / 2x 80gb intel x25 ssd của tôi (debian 5.0 / mysql 5.0 / 64bit) thành bi-xeon / 24gb ram / 2x 120gb intel 320 ssd (ub Ubuntu 10.10 / mysql 5.1 / 64 bit).

bây giờ tôi đang đối mặt với vấn đề rằng hiệu suất kém hơn so với "hộp nhỏ hơn". Trên cả hai máy chủ, tôi đã sử dụng nginx / php fcgi để phục vụ nội dung.

Tôi chỉ sử dụng innodb, có Đọc / Viết khoảng 65% / 35%. Khoảng 800 - 1000 qps nhưng tất cả các Truy vấn đều đơn giản và không bao giờ tham gia nhiều hơn 1 bảng bổ sung. Tất cả các chỉ mục được đặt và không có truy vấn riêng lẻ nào được ghi vào nhật ký chậm (> 2 giây). Hiện tại tôi có khoảng 400mb dữ liệu (khoảng 1gb với các chỉ mục) hy vọng nó sẽ tăng gấp đôi mỗi tháng.

Tôi ngưỡng mộ tất cả những người có thể cho tôi một gợi ý những gì cần thay đổi để làm cho nó chạy mượt hơn.

Cấu hình cũ trên hộp i7 là như thế này (hỗn hợp myisam / innodb), hoạt động khá tốt lên đến hơn 800 người dùng.

my.cnf cũ

   key_buffer              = 3000M
   max_allowed_packet      = 128M
   thread_stack            = 192K
   thread_cache_size       = 8
   max_connections        = 400
   table_cache            = 8000
   thread_concurrency     = 16
   query_cache_limit       = 8M
   query_cache_size        = 128M
   wait_timeout            = 10
   interactive_timeout     = 10
   connect_timeout         = 600
   low_priority_updates    = 1
   join_buffer_size        = 8M
   read_buffer_size        = 2M
   sort_buffer_size        = 3M
   myisam_sort_buffer_size = 32M
   read_rnd_buffer_size    = 4M
   innodb_buffer_pool_size = 3G
   innodb_log_buffer_size  = 8M

Cấu hình mới trên hộp bi-xeon là như thế này (innodb thuần túy), gây ra tải cao với hơn 300 người dùng. Khoảng 30 quy trình mysql nằm ở đầu danh sách quy trình.

Đĩa I / O:

    avg-cpu:  %user   %nice %system %iowait  %steal   %idle
              36.28    0.00    1.60    0.17    0.00   61.95

my.cnf

    key_buffer              = 64M
    max_allowed_packet      = 1M
    thread_stack            = 192K
    thread_cache_size       = 128
    max_connections        = 500
    table_cache            = 512
    #thread_concurrency     = 10
    sort_buffer_size        = 256K
    read_buffer_size        = 256K
    read_rnd_buffer_size    = 256K
    tmp_table_size          = 32M
    max_heap_table_size     = 32M
    query_cache_limit       = 1M
    query_cache_size        = 128M
    query_cache_type        = 1

    innodb_file_per_table = 1
    innodb_data_file_path = ibdata1:1000M:autoextend
    innodb_buffer_pool_size = 16384M
    innodb_additional_mem_pool_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_support_xa = 0
    innodb_lock_wait_timeout = 50
    innodb_flush_method=O_DIRECT
    innodb_log_files_in_group = 2
    innodb_log_file_size = 128M
    innodb_log_buffer_size = 8M
    innodb_thread_concurrency = 12

Hmmm, skip-name-resolvebị vô hiệu hóa và nó có thể được kích hoạt?
Wrikken

Câu trả lời:


7

Tôi đã viết một số bài đăng trong StackExchnage

  1. Điều chỉnh MySQL cho InnoDB và MyISAM
  2. Cách kiểm soát InnoDB Diskspace
  3. Một quan điểm khác về quản lý không gian đĩa MySQL
  4. Quan điểm về Tối ưu hóa InnoDB
  5. Tinh chỉnh InnoDB

Xin vui lòng đọc những điều này để được hướng dẫn bạn cần.

Bây giờ, đối với các vấn đề cấp bách hơn: Bạn đã đề cập rằng bạn có 400 MB dữ liệu, 1GB với các chỉ mục. Điều đó làm tôi sợ rằng các chỉ mục của bạn lớn hơn 50% so với dữ liệu. Tuy nhiên, vì tất cả dữ liệu của bạn là InnoDB và bạn hài lòng với hiệu suất truy vấn hiện tại, cài đặt của bạn là quá đủ, nhất là 16384 MB của innodb_buffer_pool_size. Đó là 16GB. Bạn đã được thiết lập ở đó. Nhưng chờ đã !!! Innodb_log_file_size của bạn là 128M? Cách quá nhỏ cho nhóm bộ đệm 16GB. Bạn nên thay đổi kích thước các tệp ib_logfile (đặt innodb_log_file_size thành 2047M).

Bạn có thể gặp phải tải trên cơ sở mỗi luồng. Hãy thử thiết lập bộ đệm kết nối của bạn (jo_buffer_size, sort_buffer_size, read_buffer_size, read_rnd_buffer_size)

Từ tôi: Tại sao MySQL nói tôi hết bộ nhớ?

Từ @DTest: Làm thế nào để bạn tính toán biến mys_ max_connections?

Hãy thử một lần !!!


tất cả chỉ là về việc thiết lập một số chỉ mục ... bây giờ tôi có một số cột được lập chỉ mục kép trong các kết hợp khác ... và hiện tại tôi có 35 GB dữ liệu và 10'000qps ... và nó hoạt động trơn tru như tơ.
Kilian

0
  • Bạn đã chuyển đổi một số bảng từ MyISAM sang InnoDB?
    Nếu vậy, hãy kiểm tra các cải tiến / suy giảm hiệu suất tinh tế trong http://mysql.rjweb.org/doc.php/myisam2innodb
  • innodb_flush_log_at_trx_commit = 1
    - gây ra một ghi vào nhật ký sau mỗi giao dịch. Cân nhắc sử dụng = 2.
  • max_connections- SHOW GLOBAL STATUS LIKE 'max_used_connections'
    - điều đó sẽ cho bạn biết bạn cần bao nhiêu kể từ khi khởi động.
  • bộ đệm truy vấn:

    query_cache_size        = 128M
    query_cache_type        = 1

    Đây có thể là tổn thương. Ở trên, giả sử, 50MQC dành quá nhiều thời gian cho việc bảo trì. Có nó ONcó thể là lãng phí, quá. Làm SHOW GLOBAL STATUS LIKE 'Qc%'để kiểm tra tính hiệu quả.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.