LINUX.ORG.RU
Ответ на: комментарий от post-factum

Там же одновременно только 1 поток работает

Это совсем не мешает другим получать управление.

baverman ★★★
()

чем обусловлен лимит на потоки?

Ты уверен, что это не системный лимит? Сходу инфа не нарылась.

baverman ★★★
()

А почему ты решил что там есть лимит?

Много тредов это просто не целесообразно.

true_admin ★★★★★
()
Ответ на: комментарий от tailgunner

Ну это я конкретно о linux. Проверить легко: #include <pthread.h> #include <iostream>

#define NUM_THREADS 100

void *TaskCode(void *argument) { sleep(60); return NULL; }

int main (int argc, char *argv[]) {

pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; int rc, i;

for (i=0; i<NUM_THREADS; i++) { thread_args[i] = i; std::cout << «Creating thread » << i << std::endl; rc = pthread_create(&threads[i], NULL, TaskCode, (void *) &thread_args[i]); }

for (i=0; i<NUM_THREADS; i++) { rc = pthread_join(threads[i], NULL); }

return 0; }

Собираем и смотрим free до запуска и после - гиг пропадет.

x-term ★★
()
Ответ на: комментарий от x-term
import threading
import time

def do():
    time.sleep(1000)

for _ in range(100):
    t = threading.Thread(target=do)
    t.start()
bobrov    1967  3.3  0.3 828496  4004 pts/0    Sl+  21:56   0:00 python /tmp/wow.py
baverman ★★★
()
Ответ на: комментарий от x-term

Собираем и смотрим free до запуска и после - гиг пропадет.

Диагноз ясен. Почитай про виртуальную память.

baverman ★★★
()
Ответ на: комментарий от x-term

> Собираем и смотрим free до запуска и после - гиг пропадет.

Мде. Подумай на досуге, почему некоторые процессы занимают гораздо меньше 10М.

P.S. нити и процессы - вещи разные.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ты не доверяешь команде free? :) До запуска свободно 5 гиг, после запуска свободно 4 гига. Если поток будет 200 - потеряется 2 гига, 300 - 3 гига и так далее до out of memory.

x-term ★★
()
Ответ на: комментарий от x-term

> Ты не доверяешь команде free? :)

Доверяю. А ты ее понимаешь?

tailgunner ★★★★★
()
Ответ на: комментарий от x-term

Собираем и смотрим free до запуска и после - гиг пропадет.

у меня три мегабайта исчезло :). Да и не должно было много сожраться, линух даже под стек, на сколько я понял, выделяет страницы памяти только при первом обращении к ним.

Т.е. virtual set size это именно суммарный размер всех страниц памяти, даже не выделенных. А rss это то что реально существует в памяти. Но и тут есть косяки, некоторые страницы могут быть общими для нескольких процессов, поэтому и rss доверять нельзя.

Я доверяю free :)

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

В обычной системе может и 3 метра, а вот например внутри виртуалки openvz сразу 10 метров на поток (которые у нас размер стека) исчезнут и если памяти не хватит уже будет out of memory.

x-term ★★
()
Ответ на: комментарий от x-term

Так и знал что речь про openvz!

Openvz свои квоты выдвигает на vss а не на реальную память. Этим они эффективно наябывают миллионы хомячков позволяя делать мощный overselling своих тазиков.

Hint: сделай как сдесь и будет меньше: http://wiki.openvz.org/Stack_size

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Размер стека можно задать и при создании потока, это просто еще одна вещь/лимит, про которую надо помнить. Это только в openvz? В других виртуализациях будет не так? Мы просто недавно на это натолкнулись и нас это слегка расстроило :) В системе без openvz ессно у меня создаются и десятки тысяч потоков при опять же снятых лимитах на их кол-во, но тут уже надо смотреть сколько времени будет тратиться на switch context, а сколько на полезные вычисления.

x-term ★★
()
Ответ на: комментарий от x-term

спасибо, 23733

я тупанул, у меня лимит в конфиге скрипта стоял

снял лимит и получил вот что: 300 потоков работает, 400 начинают умирать с сообщением «не могу подключиться к файлу БД», т.к. каждый поток подключается к data.db sqlite3

Это лимит базы? Можно ли его снять?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

Чем обусловлен выбор sqlite для ТАКИХ нужд?

anonymous
()
Ответ на: комментарий от sergey-novikov

400 начинают умирать

data.db sqlite3

Ты какой-то особо злобный буратино.

baverman ★★★
()
Ответ на: комментарий от sergey-novikov

300 потоков работает, 400 начинают умирать

O_O ты что творишь?? :)

Скорее всего файловые дескрипторы кончаются(по дефолту 1024 их). Короче, в лимиты упираешься.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

спасибо, буду переписывать обращение к sqlite-базе на queue-очереди.

А как можно узнать дефолтное кол-во файловых дескрипторов?
Неужели их меньше 400?

sergey-novikov ★★★
() автор топика
Ответ на: комментарий от sergey-novikov

1024. Но это не значит что ты сможешь тыщу соединений в базу открыть, тут зависит от того как оно внутри работает.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.