Corvus

Рейтинг
100
Регистрация
15.01.2007

Добавил ещё один порт, работает! Спасибо!!!

Мне нужно, чтобы с локального компа (где 22 порт запрещён провайдером домашнего интернета) трафик шёл по порту 8081, а уже на сервере перебрасывался с 8081 на 22. На сервере-то никаких запретов нет, всё можно настроить как надо.

Спасибо! Просто хотелось бы и на 22 порту шелл оставить (когда вхожу из нормальных мест, где этот порт не закрыт),

и новый порт добавить.

Вторая сторона проблемы в том, что дома комп не линуксовый, а виндовый, то есть из командной строки ssh не запустишь,

надо колдовать с настройками Putty.

Спасибо! 0.3 c мин, 0.5 с макс.

_SP_:

Я tmpfs не пользовался, но подозреваю просто скопировать туда данные и пользоваться как обычным диском.
Рамдрайвом я пользовался на клиентских машинах, под дос и виндовз, там всё обстояло именно так.

После ряда мелких улучшений, которые не решали проблему кардинально,

я смонтировал директории (с этими исходными 4000 файлами) как tmpfs,

в итоге теперь скрипт летает как птица, время выполнения устойчиво держится в пределах 0.5 с.

Проблема решена. Всем спасибо за помощь!

SocFishing:
Corvus, скорость всё путём, SSD.

Вопрос остается открытым, как много скрипт открывает этих 1 мб файлов производящих поиск в рамках одного запроса. В среднем.

Я позапускал hdparm многократно, скорость чтения с диска обычно варьируется от 50 до 150 MB/sec. Уже одно это даёт колебание времени работы скрипта в разы.

Скрипт открывает около 3900 файлов по 1 мегабайту, из каждого файла читает 4 байта (по заданному смещению, а оно прямо зависит от широты и долготы точки, то есть в файлах хранятся данные для узлов географической сетки). Таким образом формируется массив исходных данных для работы скрипта.

---------- Добавлено 14.01.2020 в 14:18 ----------

_SP_:

Тут еще надо смотреть как вы там читаете... не окажется ли так, что чем дальше от начала файла ваши данные, тем дольше выполняется всё это и по факту он не по смещению читает, а действительно перебирает начиная с начала.

Читаю так:

function ReadRec ($filename, $offset) {

if ( $fp = fopen($filename,'r') ) {

fseek($fp, $offset);

$rec = fread($fp, 4);

//dump($rec);

$newrec = @unpack ('f', $rec);

}

fclose($fp);

return @$newrec[1];

}

---------- Добавлено 14.01.2020 в 14:40 ----------

_SP_:

Пробовали какой-нибудь "ramdrive" ?
Т.е. смонтировать том "в оперативную память" загрузить это всё на него и делать к нему точно такие-же запросы ?
У меня при таком решении буст был даже по сравнению с SSD очень ощутимым.

Спасибо, почитаю на эту тему.

На сервере уже есть tmpfs, осталось разобраться, как её использовать.

Filesystem Size Used Avail Use% Mounted on

/dev/md1 1.4T 833G 472G 64% /

tmpfs 7.7G 0 7.7G 0% /dev/shm

/dev/md0 496M 43M 428M 10% /boot

tmpfs 7.7G 0 7.7G 0% /usr/local/psa/handlers/before-local

tmpfs 7.7G 0 7.7G 0% /usr/local/psa/handlers/before-queue

tmpfs 7.7G 0 7.7G 0% /usr/local/psa/handlers/before-remote

tmpfs 7.7G 0 7.7G 0% /usr/local/psa/handlers/info

tmpfs 7.7G 0 7.7G 0% /usr/local/psa/handlers/spool

---------- Добавлено 14.01.2020 в 14:46 ----------

_SP_:


не окажется ли так, что чем дальше от начала файла ваши данные, тем дольше выполняется всё это и по факту он не по смещению читает, а действительно перебирает начиная с начала. Это надо проверить. Проверить легко. Допишите в каждый файл 1-10мб в начало(любого мусора), сделайте офсет всего что у вас есть на эти 1-10мб и посмотрите изменится ли время.

Проверил. Я временно видоизменил скрипт так, чтобы он читал данные по смещению, заданному принудительно (а не рассчитывал его исходя из широты и долготы). Отличий нет, читаешь с начала файла или из его конца, время выполнения скрипта всё равно случайным образом варьируется от 0.5 до 40 сек.

SocFishing:
Corvus, это меняет дело

скидываем кеш файловой системы и тестируем скорость чтения диска
sudo /sbin/sysctl -w vm.drop_caches=3
dd if=tempfile of=/dev/null bs=1M count=1024

какое значение скорости это показало?

1024+0 records in

1024+0 records out

1073741824 bytes (1.1 GB) copied, 1.44716 s, 742 MB/s

hdparm выдаёт:

/dev/sda

Timing cached reads: 3590 MB in 2.00 seconds = 1795.36 MB/sec

Timing buffered disk reads: 290 MB in 3.02 seconds = 96.08 MB/sec

/dev/sdb:

Timing cached reads: 3580 MB in 2.00 seconds = 1789.78 MB/sec

Timing buffered disk reads: 474 MB in 3.00 seconds = 157.90 MB/sec

SocFishing:
А использовать сервисы по определению геоположения не то, на javascript, тот же яндекс? 9 гигабайт не мало для реалтайма, я думаю будет лучше, чем последовательно читать. Через БД можно оптимальнее обойти, если еще построить логику с лимитированием и индексами. Плюс можно выставить кеш на БД.

У вас последовательно с файлов читает кусками или построчно? если построчно, это очень медленные операции.

1. У меня не определение геоположения, а геопривязанные данные - физические параметры атмосферы для разных точек планеты, для разных высот и разных моментов времени.

2. Читаю из каждого файла одно число, 4 байта, по заданному смещению (смещение вычисляется по широте и долготе точки)

примерно так:

if ( $fp = fopen($filename,'r-') ) {

fseek($fp, $offset);

$rec = fread($fp, 4);

$newrec = @unpack ('f', $rec);

}

fclose($fp);

return @$newrec[1];

---------- Добавлено 11.01.2020 в 19:36 ----------

_SP_:
Реально количество файлов какое ? Всего их сколько ? Объем какой ?

Вторичный вызов того-же запроса приводит к тому-же времени выполнения ?
Вызов быстрого всегда быстр ?

1. 4150 файлов, 4,3 Гб, каждый файл около 1 Мб.

2, 3. Да. Если второй раз выполнить точно такой же запрос (с той же широтой и долготой), данные возвращаются мгновенно.

А если немного изменить широту/долготу, тут уже 50:50, или 0.5 сек, или 30-40 сек.

---------- Добавлено 11.01.2020 в 19:41 ----------

sochi-russia:
А если сделать кэширование данных

Я думал уже об этом. Сделать что-то вроде демона, который будет держать все эти файлы (несколько гигабайт) в памяти и считывать нужные данные прямо оттуда.

Но у меня подобный проект (с чтением данных из большого количества файлов) работает уже 8 лет на другом сервере, VPS, с гораздо более скромными системными параметрами. Скрипты устойчиво выполняются пусть не за 0.5 с, так за 2-3 с.

На выделенном сервере, как я ожидал, всё будет летать. Но нет - ситуация совсем другая и грустная.

Такое впечатление, что что-то с настройками файловой системы.

_SP_:
Реально количество файлов какое ? Всего их сколько ? Объем какой ?

БД с индексами, скорее всего не даст вам никакого буста, если вам реально нужно содержимое этих файлов.

У меня тоже такое подозрение. Попадались статьи на тему, что если индексы не нужны (априори известно местонахождение нужных данных - в каком файле и по какому смещению, а это как раз мой случай), то прямая работа с файлами априори быстрее, чем любая БД.

Sly32:
а что с интернетом у вас, может скорость соединения лагает?
пинги сервера ок?

Пинги нормальные, интернет тоже. Время выполнения скрипта я подсчитываю в самом скрипте, то есть без учёта затрат на передачу данных по сети. Если скрипт вызывать не через веб, а из командной строки через шелл, работает он так же неустойчиво.

---------- Добавлено 10.01.2020 в 16:25 ----------

Sitealert:
Расставьте в программе отладочные маркеры и логируйте их прохождение. Выявляйте узкое место программы.

Да, я так делал. Отображал и время выполнения отдельных операций, и затраты памяти.

В том-то и проблема, что при одном запуске скрипта каждая операция чтения файла занимает, условно, 0.001 секунды и общее время работы скрипта 0.5 секунд, а в другом каждая операция чтения 0.1 секунды и общее время 40-50 секунд.

Вычисления в скрипте выполняются буквально за 0.2 секунды. То есть основное время уходит на чтение файлов, оно-то и занимает очень много времени.

---------- Добавлено 10.01.2020 в 16:29 ----------

SocFishing:
Ну смотрите.

1. следует перебрать скрипт и запихнуть все массивы данных в память, например мемкеш и монго дб с параметро загрузка из памяти

2. очень много открытий файлов, дисковых операций, когда один процесс открывает файл, он блокируется на время открытия для других процессов скорее всего

3. нужно перенастроить максимальное число возможных открытый файлов на VDS, вероятно бъет в лимит и больше не может открыть. Возможно в этом и причина. В SSH введите sudo ulimit -n 32768 и и повысить /proc/sys/fs/file-max в текстовике. Посмотреть другие лимиты ulimit -a

Спасибо! Попробую то, что Вы сказали.

Как думаете, есть ли смысл помещатьисходные данные в БД? Их общий размер около 9 Гб, обновляются они несколько раз в сутки. Будет ли выигрыш по времени чтения, и стоит ли игра свеч, ведь залив в БД такого объёма будет идти, вероятно, весьма долго.

Просто зная широту и долготу точки, я однозначно знаю, по какому смещению читать данные из файлов. Казалось бы, в таком случае чтение из файлов должно работать быстрее, чем чтение из БД?

---------- Добавлено 10.01.2020 в 16:32 ----------

SocFishing:
Ну смотрите.

Посмотреть другие лимиты ulimit -a

core file size (blocks, -c) 0

data seg size (kbytes, -d) unlimited

scheduling priority (-e) 0

file size (blocks, -f) unlimited

pending signals (-i) 125436

max locked memory (kbytes, -l) 64

max memory size (kbytes, -m) unlimited

open files (-n) 500000

pipe size (512 bytes, -p) 8

POSIX message queues (bytes, -q) 819200

real-time priority (-r) 0

stack size (kbytes, -s) 10240

cpu time (seconds, -t) unlimited

max user processes (-u) 50000

virtual memory (kbytes, -v) unlimited

file locks (-x) unlimited

По идее этого должно быть достаточно?

Всего: 50