LINUX.ORG.RU

8
Всего сообщений: 40

Многопоточный бекап, скрипт

С наступающим! :)

Нужно бекапить большое количество объемных баз данных и веб контента, и отправлять это все на другой сервер.

На текущий момент это все делается последовательно:

- делаем дамп первой базы

- пакуем первую базу в архив

- копируем первую базу на другой сервер

- делаем дамп второй базы

- пакуем вторую базу в архив

- копируем вторую базу на другой сервер

...

- пакуем веб контент из одной директории в архив

- пакуем веб контент из второй директории в архив

...

- копируем на другой сервер запакованный веб контент из первой директории

- копируем на другой сервер запакованный веб контент из второй директории

....

Все это занимает много времени и поскольку у сервака достаточно вычислительных ресурсов, хотелось бы сделать многопоточный бекап.

Т.е. делим всю информацию, которую хотим бекапить на объекты. Далее для каждого типа объекта (у меня их два: mysql база и директория) пишу вспомогательный скрипт, который будет его бекапить и переносить куда надо. (тут все просто и вопросов нет)

Еще будет основной скрипт, который должен запускать первый скрипт приминительно к конкретным объектам, которые надо бекапить. НО не последовательно, а параллельно группами. Т.е. допустим у меня 100 баз разного размера, я допускаю возможность бекапа 5 баз одновременно. Соответственно, этот основной скрипт, запускает 5 вспомогательных скриптов, которые бекапят базы и ждет, пока один из них не закончит работу, как закончил он запускает еще один скрипт и т.д., пока все базы не обработает.

Т.е. мне нужна возможность параллельно держать запущенными определенное количество задач, и по мере их выполнении добавлять новые задачи, пока они не закончатся. Надеюсь понятно объяснил.

Собственно вопрос, как скрипт может контролировать количество запущенных им в фоне задач, чтобы по мере их выполнения запускать новые задачи и поддерживая одновременное количество выполняемых задач на определенном уровне?

 ,

samson_b ()

Пятничная разминка для мозгов

Салют. Чё-то не совладаю. Хочу в переменные поместить вывод фунцкции. К примеру:

pstr() {
[[ $1 -eq 1 ]] && echo "многострочный текст"
[[ $1 -eq 2 ]] && echo "другой текст"
}
export -f pstr #без экспорта parallel функцию не узнаёт
хотел так
read -r text1 text2 < <(parallel pstr ::: 1 2)
echo $text1 --> многострочный
echo $text2 --> текст
####
read -r -d 'END' text1 text2 < <(parallel pstr ::: 1 2)
echo $text1 --> многострочный
echo $text2 --> текст другой текст
в общем хз, есть какие мысли?

 ,

gnu_linux ()

Вышел GNU Parallel 20191222 ('Impeachment')

 ,

saahriktu ()

bash параллельное выполнение

День добрый! У меня есть 4 скрипта на баше, я хочу запускать их параллельно и по завершении всех четырех скриптов хочу выполнить команду. Есть такая штука вроде как parallel. Кто-то может подсказать как сделать лучше? :) Спасибо :)

 ,

init_ ()

Паралельный доступ к памяти

Имеем два ядра и массив структур. Этот массив хочется обрабатывать параллельно и без блокировок и синхронизаций. Данные меньше размера кеш линии поэтому если передать как есть две структуры будут лежать в одной кеш линии и попадут вместе в L1 каждого из ядер и даже если запись происходит в разные места то будет взаимоблокировка с синхронизацией. Поэтому я увеличиваю размер структур до размера кеш линии теперь каждое ядро загружает в L1 независимые данные и могут их обработать без блокировок. Также и то и то лежит в одном массиве размером со страницу памяти. Что исключает работы ядер с двумя таблицами адресации и переключениями между ними.

Помимо этого я ещё передаю в оба потока указатель на одну и туже структуру но эту структуру потоки будут только читать.

Вопрос - всегда ли данные которые лежат в 1 кеш линии попав в L1 отдельных ядер вызывают процесс синхронизации? Или это происходит только тогда когда данные изменяются? Ну тоесть память помечается как неактуальная и L1 другого ядра вынуждено перезагрузить данные снова. Хотя они уже были.

Я сейчас не говорю про атомарность, мутексы и прочее. Тут дело в том что всё должно быть без этого.

 , , , ,

LINUX-ORG-RU ()

Сделать превью всех страниц .PDF файла используя parallel

На примере предыдущей темы с использованием parallel нужно сделать превью всех страниц .PDF файла. Не смог я в имена+переменные. Как правильно это делается?

UPDATE Оказалось, не получалось потому, что правки делал в другом файле. Нижеприведенный вариант работает. Поскольку уже есть комментарий, удалить тему лишен доступа.

#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
rm -f $fbname
n=$(gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit";) 
SECONDS=0
#seq $n | parallel ./script_pdf.sh "$1" {} {} >> $fbname
seq $n | parallel convert -thumbnail x300 -background white -alpha remove "${fbname}.pdf[{}]"  "{}_thumbnail.png"
echo $SECONDS > "${fbname}_"

 ,

abbat81 ()

Параллельный запуск одного скрипта

Обработка .pdf файлов на заполненность страниц. Проблема в том, что файл на 80 страниц обрабатываю процессором E8400 за 22 сек., а на I7-2600 - за 19 секунд. 3-4 секунды - facepalm. Да, на одном ядре. Поэтому ищу способ запускать скрипт параллельно для обработки каждой страницы с выводом результата в отдельный файл для каждой страницы.

Есть два скрипта: mass_pdf.sh и script_pdf.sh.

Запуск ./mass_pdf.sh 456.pdf

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}

rm -f $fbname

n=$(gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit";) 
n=$(($n+1))
SECONDS=0
for ((i=1; i < $n; i++))
do
./script_pdf.sh "$1" $i $i >> $fbname;
done
echo $SECONDS > "${fbname}_"

script_pdf.sh

#!/bin/bash
gs -q -dNOPAUSE -dBATCH -dFirstPage="$2" -dLastPage="$3"  -sDEVICE=inkcov -o - "$1";

РЕШЕНИЕ: mass_pdf.sh:

#!/bin/bash
fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
rm -f $fbname
n=$(gs -q -dNODISPLAY -c "("$1") (r) file runpdfbegin pdfpagecount = quit";) 
SECONDS=0
seq $n | parallel ./script_pdf.sh "$1" {} {} >> $fbname
echo $SECONDS > "${fbname}_"
#!/slavaisu

 ,

abbat81 ()

Подскажите инструменты для создания визуализации flow нескольких процессов?

Имеется модель, в которой несколько «ядер» выполняют некоторые процессы. Каждый на своем ядре. Иногда некоторые ядра простаивают, иногда один процесс завершается, начинается другой.

Хочется визуализировать это на временной диаграмме, чтобы наглядно представить ответы на вопросы «есть ли моменты, где какое-то ядро долго простаивает», «что выполняется на таком-то ядре в заданный момент времени». Визуально хочется получить что-то вроде http://twimgs.com/ddj/images/article/2009/0910/091023hillar_f6.gif

Основной инструмент разработки - Python, пока рассматривал варианты:

matplotlib:
+ простой
+ красивый
- результирующие изображения могут быть длинными, а тут на выходе растр, которые скроллить не хочется сильно
- возможно, сложно будет организовать подписывание процессов (например, если визуально процесс короткий и на картинке нет места для имени этого процесса)

pyqt:
+ скорее всего, можно что угодно и как угодно
+ если подписи не будут помещаться, можно убрать их в pop-up подсказки при наведении указателя
- сложный

 , , , ,

omegatype ()

возможно ли выполнить команду на нескольких хостах строго одновременно?

Доброго времени суток

Сабж. Одновременно - хотя бы с точностью до 1 секунды. Время синхронизируется по ntp

parallel-ssh и gnu parallel + ssh для 12 хостов дают разброс в 3..5 секунд. ansible тем более не обещает одновременности

Есть идеи?

 ,

router ()

Как правильно поллить результат inb (данные с порта)?

По LPT порту воткнута железка, на которой есть кнопка.

Когда кнопка нажата, из порта по адресу можно прочитать 1, когда не нажата — 0

Как правильно с этим работать? Поллить раз в 100 мс, или искать способ заставить эту конструкцию генерировать прерывание?

 , , , ,

max_lapshin ()

Вышел GNU Parallel 20190522 ('Akihito')

 ,

saahriktu ()

Существует ли в СИ рабочий аналог lua Coroutines в виде библиотеки ?

плиз, скиньте ссылку если кто знает

 ,

Vlad-76 ()

Вышел GNU Parallel 20190322 ('FridayforFuture')

Сабж. Новость: http://savannah.gnu.org/forum/forum.php?forum_id=9401

В этом релизе среди прочего завезли parallel_cheat.pdf .

Скачать: ftp://ftp.gnu.org/gnu/parallel/parallel-20190322.tar.bz2

 ,

saahriktu ()

можно ли распараллелить make?

у меня при сборке make не всегда параллелит задачи, даже если указываю -j. сама компиляция происходит быстро - с задействованием всех ядер. но долго ожидать конфигурирования. соизмеримо со временем компиляции, если не превосходит. (имею ввиду «простои» ядер ЦП подолгу, когда пишет «checking for...» и задействовано лишь одно ядро). как можно ускорить и распараллелить эти этапы (autoconf/configure) на многоядерном процессоре?

 , , ,

xakepp35 ()

Параллельный запуск цепочки программ, обменивающихся текстовыми файлами

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

Алгоритм работы: 1) В папку с программами копируется бинарный файл с данными 2) Запускается цепочка программ, первая из которых считывает файл с данными, она генерирует один или несколько текстовых файлов, которые являются входами для других программ, те в свою очередь тоже пишут файлы, и так до последней программы.

Проблема в том, что необходимо параллельно обрабатывать несколько бинарных файлов с данными (в кроне). Если бы обмен шел через стандартный ввод/вывод, то проблем бы не было, для каждой цепочки был бы свой процесс. Но так как текстовые файлы общие, получится не пойми что, что к чему относится понять будет невозможно.

Использовать лок-файлы затруднительно и ненадежно на мой взгляд, так как много файлов и много процессов. Может генерировать какие-то изолированные песочницы?

Подскажите как решить такую проблему?

 ,

flanker ()

параллельная загрузка маленьких файлов

  • есть список из много-много файлов
  • очень.. нет ОЧЕНЬ(!) широкий канал

как делают паралельную загрузку файлов так чтобы боттлнек был HDD?

 , ,

sniper21 ()

OpenCL использование host memory

https://pastebin.com/ahYUeUcE - вот это мой турбо-код. Значит вот допустим появиться у меня класс(1), который содержит вектор int, ну и в нем еще вектор классов(2) которые тоже содержат в себе вектор int-ов. Ну и вообщем этих классов(1) миллион допустим. И нужно что-нибудь сосчитать. Используя вектор класса(2) и вектор класса(1). Я это к чему,,, к тому что память мне неудобно копировать. Хочу значет просто ссылку на массив из объектов. Тобеш не копировать в память GPU, а чтоби GPU использовала host(RAM(если не ошибаюсь) память. Плохая ли затея? Нету ли у кого примера как это делать, или хотя бы отрывок кода.

Я даже что-то нашел

https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateBuffer...

«Yes, use clCreateBuffer with flags containing one of:

CL_MEM_USE_HOST_PTR CL_MEM_ALLOC_HOST_PTR »

НО я поменял как бы на аргумент на CL_MEM_USE_HOST_PTR , ну и там полились ошибки, я даже догадываюсь почему, но исправить и сделать как нужно не понимаю, томушо новичок в OpenCL.

Ну и возможно нужная инфа то , что когда буду считать допустим сумму векторов, это же будет Readonly мемори, на хосте, так что недолжно произойти накладки(состыковки, или как это называется хех) Всем спасибо, если кто поможет.

 , ,

xionovermazes ()

как переделать это в многопоточное ?

Этот кусок кода выполняет то, что нужно. Конвертирует flac в mp3. Но делает это в один поток. Медленно. Коллекция конвертируется более суток. Как это переделать, чтобы можно было конвертировать не в один поток, а скажем в 4 ? Думаю, что это возможно сделать с помощью parallel. В баше врядли смогу осилить это, а в python не хочется лезть :(


find . -name "*.flac" | while read a; do
	OUTF=`echo "$a" | sed s/\.flac$/.mp3/g`
	ARTIST=`metaflac "$a" --show-tag=ARTIST | sed s/.*=//g`
	TITLE=`metaflac "$a" --show-tag=TITLE | sed s/.*=//g`
	ALBUM=`metaflac "$a" --show-tag=ALBUM | sed s/.*=//g`
	GENRE=`metaflac "$a" --show-tag=GENRE | sed s/.*=//g`
	TRACKNUMBER=`metaflac "$a" --show-tag=TRACKNUMBER | sed s/.*=//g`
	DATE=`metaflac "$a" --show-tag=DATE | sed s/.*=//g`

	flac -c -d "${a}" | lame -V 0 \
		-m j \
		--cbr \
		-b 192 \
		--noreplaygain \
		-q 0 \
		--lowpass 20.7 \
		--add-id3v2 \
		--pad-id3v2 \
		--ignore-tag-errors \
		--tt "$TITLE" \
		--tn "${TRACKNUMBER:-0}" \
		--ta "$ARTIST" \
		--tl "$ALBUM" \
		--ty "$DATE" \
		--tg "${GENRE:-12}" \
		- "$OUTF"

	rm -rf "${a}"
done

 , , , ,

Xwo ()

Количество доступных потоков pthread

Как узнать максимальное количество доступных для использования потоков в C++(pthread).

 , ,

xionovermazes ()

параллельность в расте

Здравствуйте. Я тут немного решил поэксперементировать с параллельностью в расте и сделал маленький генератор фракталов. И был немного удивлен, когда увидел, то при распараллеливаниии на несколько тредов, производительность не только лишь не увеличивается, но еще и уменьшается! Это я криворукий или треды в расте нифига не параллельны?

extern crate image;

use std::thread;
use std::sync::{Mutex, Arc};
use std::time;
use image::*;
use std::env;

fn calculate_point(x : f64, y : f64, depth : usize) -> f32 {
    let mut zx = 0.0;
    let mut zy = 0.0;
    let mut zx1;
    let mut zy1;
    for i in 0 .. depth {
        zx1 = (zx * zx) - (zy * zy) + x;
        zy1 = zx * zy * 2.0 + y;
        if zx1 * zx1 + zy1 * zy1 > 4.0 {
            return (i as f32) / (depth as f32);
        }
        else {
            zx = zx1;
            zy = zy1;
        }
    }
    return 1.0;//depth as f32;
}

fn get_color(colors : &Vec<[f32;3]>, buffer : &mut Vec<[f32;3]>, x : f32) -> Rgb<u8> {
    let mut len = colors.len() - 1;
    for i in 0 .. len {
        for j in 0 .. 3 {
            buffer[i][j] = colors[i][j] + (colors[i+1][j] - colors[i][j]) * x
        }
    }
    while len > 1 {
        for i in 0 .. len - 1 {
            for j in 0 .. 3 {
                buffer[i][j] = buffer[i][j] + (buffer[i+1][j] - buffer[i][j]) * x
            }
        }
        len -= 1;
    }
    return Rgb([buffer[0][0] as u8, buffer[0][1] as u8, buffer[0][2] as u8]);
}

fn make_pic_1th(width : u32, height : u32) -> RgbImage {
    let mut pic = ImageBuffer::new(width, height);
    let colors : Vec<[f32;3]> = vec![[0.0,0.0,0.0], [255.0,0.0,0.0], [255.0,255.0,0.0], [255.0,255.0,255.0]];
    let mut buffer = colors.clone();
    for i in 0 .. width {
        let x = (i as f64) / (width as f64) * 2.0 - 1.0;
        for j in 0 .. height {
            let y = (j as f64) / (height as f64) * 2.0 - 1.0;
            (*pic.get_pixel_mut(i,j)) = get_color(&colors, &mut buffer, calculate_point(x, y, 1000));
        }
    }
    pic
}

unsafe fn calc_rows(index : u32, step : u32, width : u32, height : u32, pic : SendPtr<RgbImage>, live_flag : Arc<Mutex<bool>>) {
    let colors : Vec<[f32;3]> = vec![[0.0,0.0,0.0], [255.0,0.0,0.0], [255.0,255.0,0.0], [255.0,255.0,255.0]];
    let mut buffer = colors.clone();
    let pic       : *mut RgbImage = match pic {SendPtr(a) => a};
    for i in 0 .. width {
        let x = (i as f64) / (width as f64) * 2.0 - 1.0;
        let mut j = index;
        while j < height {
            let y = (j as f64) / (height as f64) * 2.0 - 1.0;
            (*(*pic).get_pixel_mut(i,j)) = get_color(&colors, &mut buffer, calculate_point(x, y, 1000));
            j += step;
        }
    }
    (*live_flag.lock().unwrap()) = false;
}

struct SendPtr<A>(*mut A);
unsafe impl<A> Send for SendPtr<A> {}
unsafe impl<A> Sync for SendPtr<A> {}

fn make_pic_3th(width : u32, height : u32) -> RgbImage {
    let mut pic = ImageBuffer::new(width, height);
    let f1 = Arc::new(Mutex::new(true));
    let f2 = Arc::new(Mutex::new(true));
    let f3 = Arc::new(Mutex::new(true));
    unsafe {
        macro_rules! spawn {($i:expr,$m:expr,$flag:expr) => {
            let ppic  = SendPtr(&mut pic);
            let pflag = $flag.clone();
            thread::spawn(move|| {calc_rows($i, $m, width, height, ppic, pflag)});
        }};
        spawn!(0, 3, f1);
        spawn!(1, 3, f2);
        spawn!(2, 3, f3);
    }
    let dur = time::Duration::from_millis(50);
    loop {
        let a : bool = *f1.lock().unwrap();
        let b : bool = *f2.lock().unwrap();
        let c : bool = *f2.lock().unwrap();
        if a || b || c {
            thread::sleep(dur)
        } else {
            break
        }
    }
    pic
}

fn main() {
    let args : Vec<String> = env::args().collect();
    let pic = if args[1] == "1" {make_pic_1th(1000,1000)} else {make_pic_3th(1000, 1000)};
    match pic.save("out.png") {
        Ok(_) => (),
        Err(e) => {
            println!("error: {:?}", e)
        }
    }
}

 ,

Aswed ()