máy chủ của tôi đã chạy với Amazon Ec2 linux. Tôi có một máy chủ mongodb bên trong. Máy chủ mongodb đã chạy quá tải, và thật không may, tôi đã gặp phải sự cố với nó: /
Như đã biết, mongodb tạo ra luồng mới cho mọi kết nối máy khách và điều này đã hoạt động tốt trước đó. Tôi không biết tại sao, nhưng MongoDB không thể tạo hơn 975 kết nối trên máy chủ với tư cách là người dùng không có đặc quyền (nó chạy dưới một người dùng mongod). Nhưng khi tôi chạy nó với tư cách là người dùng root, nó có thể xử lý tới 20000 kết nối (giới hạn bên trong mongodb). Nhưng, các nghiên cứu sâu hơn cho thấy, vấn đề đó không phải là máy chủ MongoDB, mà là bản thân linux.
Tôi đã tìm thấy một chương trình đơn giản, kiểm tra số lượng kết nối tối đa:
/* compile with: gcc -lpthread -o thread-limit thread-limit.c */
/* originally from: http://www.volano.com/linuxnotes.html */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define MAX_THREADS 100000
#define PTHREAD_STACK_MIN 1*1024*1024*1024
int i;
void run(void) {
sleep(60 * 60);
}
int main(int argc, char *argv[]) {
int rc = 0;
pthread_t thread[MAX_THREADS];
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setstacksize(&thread_attr, PTHREAD_STACK_MIN);
printf("Creating threads ...\n");
for (i = 0; i < MAX_THREADS && rc == 0; i++) {
rc = pthread_create(&(thread[i]), &thread_attr, (void *) &run, NULL);
if (rc == 0) {
pthread_detach(thread[i]);
if ((i + 1) % 100 == 0)
printf("%i threads so far ...\n", i + 1);
}
else
{
printf("Failed with return code %i creating thread %i (%s).\n",
rc, i + 1, strerror(rc));
// can we allocate memory?
char *block = NULL;
block = malloc(65545);
if(block == NULL)
printf("Malloc failed too :( \n");
else
printf("Malloc worked, hmmm\n");
}
}
sleep(60*60); // ctrl+c to exit; makes it easier to see mem use
exit(0);
}
Và khâu được lặp lại một lần nữa, với tư cách là người dùng root, tôi có thể tạo khoảng 32k luồng, với tư cách là người dùng không có đặc quyền (người dùng mongod hoặc ec2) khoảng 1000.
Đây là một ulimit cho người dùng root:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 59470
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 60000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Đây là một ulimit cho người dùng mongod:
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 59470
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 60000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 1024
cpu time (seconds, -t) unlimited
max user processes (-u) 1024
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
Chủ đề tối đa hạt nhân:
bash-4.1$ cat /proc/sys/kernel/threads-max
118940
SELinux bị vô hiệu hóa. Không biết làm thế nào để giải quyết vấn đề kỳ lạ này ... Có thể, có ai đó không?