Developer on Alibaba Coud: Build your first app with APIs, SDKs, and tutorials on the Alibaba Cloud. Read more ＞
Always do the Windows Server to Linux platform porting work, for the thread stack space is also indefinitely, so there are some problems and summed up some of the experience for everyone to share. After 286 threads were started on my server, the thread failed to start, and the error returned was 12, which was defined as follows: #defineEnomem/OUT of memory * *
It appears that the cause of the thread failure was the failure to allocate memory, while the process occupied a virt display of 3070MB, which is estimated to be low on virtual memory.
So we looked at two platforms about the thread stack space, listed as follows:
In Windows, the CreateThread function's parameter dwstacksize is the size of the stack in bytes that will be assigned to the new thread. The stack size should be a non-zero integer of 4KB, with a minimum of 8KB. The default size of the stack is 1MB.
In Linux, the thread stack size is set in the system's default settings or in the Thread Property object, and I did not set it, so I looked at the stack size of the system using the Ulimit command, as follows:
Stack size (Kbytes,-s) 10240
No wonder the use of so much virtual memory, 286*10m=2860m, and other parts of the consumption, so virtual memory is not enough.
Also consult the documentation, reflecting the Linux platform stack default size should be 8192KB, rather than 10M, but whether my server has been modified by others is not clear.
The Linux platform operates the POSIX line stacks space using the following functions:
int Pthread_attr_setstacksize (pthread_attr_t *threadattr, int stack_size);/Set
int Pthread_attr_getstacksize (pthread_attr_t *threadattr, int stack_size);
Immediately use the above function to test, the process is as follows:
In Linux, the stack size is set in the Thread Property object, that is, the parameter "threadattr" with the type "pthread_attr_t" is passed to the function pthread_create (). Before setting the property, you need to initialize the object by calling Pthread_attr_init (), and then use the Pthread_attr_setstacksize () function to set the line stacks space size, in bytes, and then call Pthread_create ( ) to create the thread, and then call Pthread_attr_destroy () to destroy the Property object.
After the line stacks space is set to 2M, the test confirms that the virtual memory consumed by the creation thread has been reduced successfully.
Note that all pthread_attr_setxxxx calls have a function similar to the PTHREAD_XXXX call (if any), except that you can use pthread_attr_xxxx before the thread is created to update the pthread_ that will be passed as a parameter The Property object for the Create. At the same time, you can use pthread_xxxx to modify any time after you create a thread.
This article is an English version of an article which is originally in the Chinese language on aliyun.com and is provided for information purposes only. This website makes no representation or warranty of any kind, either expressed or implied, as to the accuracy, completeness ownership or
reliability of the article or any translations thereof. If you have any concerns or complaints relating to the article, please send an email, providing a detailed description of the concern or
complaint, to email@example.com. A staff member will contact you within 5 working days. Once verified, infringing content will be removed immediately.
The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion;
products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the
content of the page makes you feel confusing, please write us an email, we will handle the problem
within 5 days after receiving your email.
If you find any instances of plagiarism from the community, please send an email to:
and provide relevant evidence. A staff member will contact you within 5 working days.