Exim: письма 8192 символов отправляются заметно дольше
Отправляю через SMTP локально.
письма размером до 8192 уходят за 0.004, после 8192 уходят за 0.1, т.е. в 25 раз медленее.
т.е. уже после отправления команды «DATA\r\n», отправляю само письмо
Поскольку число выглядит очень искусственно, подозреваю, что удерживает где-то какая-то настройка. Подскажите, в какую сторону стоит глядеть?
UPDATE:
Расковырял файлы exim'a, выяснил, что утечка происходит исключительно в нем самом.
конкретно
recieve.c:
data_file = fdopen(data_fd, «w+»);
…
message_ended = read_message_data_smtp(data_file); < — этот вызов съедает все время static int
read_message_data_smtp(FILE *fout)
{
int ch_state = 0;
register int ch;
register int linelength = 0;
while ((ch = (receive_getc)()) != EOF)
{
if (ch == 0) body_zerocount++;
switch (ch_state)
{
case 0: /* After LF or CRLF */
if (ch == '.')
{
ch_state = 3;
continue; /* Don't ever write . after LF */
}
ch_state = 1;
/* Else fall through to handle as normal uschar. */
case 1: /* Normal state */
if (ch == '\n')
{
ch_state = 0;
body_linecount++;
if (linelength > max_received_linelength)
max_received_linelength = linelength;
linelength = -1;
}
else if (ch == '\r')
{
ch_state = 2;
continue;
}
break;
При этом
int (*receive_getc)(void) = stdin_getc;
int
stdin_getc(void)
{
return getc(stdin);
}
— когда в цикле прогоняется последний(>8000) кусок -резко происходит торможение, но никак не пойму причину. Может настройки самой оси стоит смотреть? FreeBSD 8.2-RELEASE стоит.
Очень похоже на минимальный размер письма попадающий под антивирус/антиспам. Точно не помню уже, но вроде у серверного Касперского такой минимальный размер. Из еще подозрительных — константа Exim-a DELIVER_OUT_BUFFER_SIZE, которая по умолчанию равна именно 8192, но это вроде размер блока на отсылку, а не на прием.
Вариант проверки — отдавать в цикле по 8192 байта в fputs и посмотреть результат.