Python сценарий в Ubuntu - OSError: [Errno 12] Невозможно выделить память - PullRequest
1 голос
/ 07 марта 2020

Я запускаю скрипт на AWS (Ubunut) экземпляре EC2. Это веб-скребок, который использует селен / хромедрайвер и безголовый chrome для очистки некоторых веб-страниц. Раньше у меня был этот скрипт без проблем, но сегодня я получаю сообщение об ошибке. Вот скрипт:

options = Options()
options.add_argument('--no-sandbox')
options.add_argument('--window-size=1420,1080')
options.add_argument('--headless')
options.add_argument('--disable-dev-shm-usage')
options.add_argument('--disable-gpu')
options.add_argument("--disable-notifications")

options.binary_location='/usr/bin/chromium-browser'
driver = webdriver.Chrome(chrome_options=options)


#Set base url (SAN FRANCISCO)
base_url = 'https://www.bandsintown.com/en/c/san-francisco-ca?page='

events = []

for i in range(1,90):
    #cycle through pages in range
    driver.get(base_url + str(i))
    pageURL = base_url + str(i)
    print(pageURL)

Когда я запускаю этот скрипт из ubuntu, я получаю эту ошибку:

  Traceback (most recent call last):
  File "BandsInTown_Scraper_SF.py", line 91, in <module>
    driver = webdriver.Chrome(chrome_options=options)
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/chrome/webdriver.py", line 73, in __init__
    self.service.start()
  File "/home/ubuntu/.local/lib/python3.6/site-packages/selenium/webdriver/common/service.py", line 76, in start
    stdin=PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1295, in _execute_child
    restore_signals, start_new_session, preexec_fn)
OSError: [Errno 12] Cannot allocate memory

Я подтвердил, что я использую ту же версию браузера Chromedriver / Chromium :

ChromeDriver 79.0.3945.130 (e22de67c28798d98833a7137c0e22876237fc40a-refs/branch-heads/3945@{#1047})


Chromium 79.0.3945.130 Built on Ubuntu , running on Ubuntu 18.04

Любая помощь приветствуется, потому что я в тупике. Что бы это ни стоило, у меня это работает на компьютере ma c, и у меня есть несколько скриптов веб-скрепинга, подобных этому, выполняющихся на одном и том же экземпляре EC2 (пока только 2 скрипта, так что не так много). Спасибо.

ОБНОВЛЕНИЕ: теперь я также получаю следующие ошибки при попытке запустить этот скрипт в Ubuntu:

    Traceback (most recent call last):
      File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 141, in _new_conn
        (self.host, self.port), self.timeout, **extra_kw)
      File "/usr/lib/python3/dist-packages/urllib3/util/connection.py", line 60, in create_connection
        for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
      File "/usr/lib/python3.6/socket.py", line 745, in getaddrinfo
        for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
    socket.gaierror: [Errno -3] Temporary failure in name resolution


     During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 601, in urlopen
    chunked=chunked)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 346, in _make_request
    self._validate_conn(conn)
  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 852, in _validate_conn
    conn.connect()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 284, in connect
    conn = self._new_conn()
  File "/usr/lib/python3/dist-packages/urllib3/connection.py", line 150, in _new_conn
    self, "Failed to establish a new connection: %s" % e)
urllib3.exceptions.NewConnectionError: <urllib3.connection.VerifiedHTTPSConnection object at 0x7f90945757f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/adapters.py", line 449, in send
        timeout=timeout
    ^[[B  File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 639, in urlopen
    ^[[B^[[A^[[A    _stacktrace=sys.exc_info()[2])
      File "/usr/lib/python3/dist-packages/urllib3/util/retry.py", line 398, in increment
        raise MaxRetryError(_pool, url, error or ResponseError(cause))
    urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.bandsintown.com', port=443): Max retries exceeded with url: /en/c/san-francisco-ca?page=6 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f90945757f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "BandsInTown_Scraper_SF.py", line 39, in <module>
        res = requests.get(url)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/api.py", line 75, in get
        return request('get', url, params=params, **kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/api.py", line 60, in request
        return session.request(method=method, url=url, **kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/sessions.py", line 533, in request
        resp = self.send(prep, **send_kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/sessions.py", line 646, in send
        r = adapter.send(request, **kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/requests/adapters.py", line 516, in send
        raise ConnectionError(e, request=request)
    requests.exceptions.ConnectionError: HTTPSConnectionPool(host='www.bandsintown.com', port=443): Max retries exceeded with url: /en/c/san-francisco-ca?page=6 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f90945757f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

Наконец, вот мое ежемесячное использование AWS в месяц, которое не не показывать превышение квоты памяти.

enter image description here

Ответы [ 2 ]

1 голос
/ 08 марта 2020

Это сообщение об ошибке ...

    restore_signals, start_new_session, preexec_fn)
OSError: [Errno 12] Cannot allocate memory

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

Кроме того, это сообщение об ошибке ...

urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='www.bandsintown.com', port=443): Max retries exceeded with url: /en/c/san-francisco-ca?page=6 (Caused by NewConnectionError('<urllib3.connection.VerifiedHTTPSConnection object at 0x7f90945757f0>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))

... подразумевает, что ваша программа успешно выполнялась до Page 5 и пока на Page 6 вы видите эту ошибку.


Я не вижу проблем в вашем блоке кода как таковом. Я взял ваш код, внёс некоторые незначительные изменения, и вот результат выполнения:


Глубокое погружение

Эта ошибка происходит от subprocess.py:

self.pid = _posixsubprocess.fork_exec(
    args, executable_list,
    close_fds, tuple(sorted(map(int, fds_to_keep))),
    cwd, env_list,
    p2cread, p2cwrite, c2pread, c2pwrite,
    errread, errwrite,
    errpipe_read, errpipe_write,
    restore_signals, start_new_session, preexec_fn)

Однако согласно обсуждению in OSError: [Errno 12] Невозможно выделить память эта ошибка OSError: [Errno 12] Cannot allocate memory связана с RAM / SWAP .


Swap Space

Swap Space - это пространство памяти на жестком диске системы, которое было назначено местом для для временного хранения данных, которые он больше не может хранить с в оперативной памяти. Это дает вам возможность увеличить объем данных, которые ваша программа может хранить в своей рабочей . Пространство подкачки на жестком диске будет использоваться, главным образом, когда в ОЗУ больше не будет достаточно места для хранения данных приложения. Однако информация, записываемая в ввод-вывод, будет значительно медленнее, чем информация, хранящаяся в оперативной памяти, но операционная система предпочтет сохранить данные приложения в памяти и использовать пространство подкачки для более старых данных. Развертывание пространства подкачки в качестве запасного варианта, когда ОЗУ вашей системы истощается, является мерой безопасности против нехватки памяти проблем в системах с доступным хранилищем без SSD.


Система Проверьте

Чтобы убедиться, что в системе уже есть свободное пространство подкачки, вам нужно выполнить следующую команду:

$ sudo swapon --show

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

$ free -h

Если в системе нет активного свопа, вы увидите вывод:

Output
               total        used       free        shared      buff/cache  available
Mem:           488M         36M        104M        652K        348M        426M
Swap:            0B          0B          0B

Создание файла подкачки

В этих случаях вам нужно выделить место для подкачки для использования в качестве отдельного раздела, посвященного задаче, и вы можете создать файл подкачки, который находится в существующем разделе. Чтобы создать файл объемом 1 ГБ, вам необходимо выполнить следующую команду:

$ sudo fallocate -l 1G /swapfile

Чтобы убедиться, что зарезервировано правильное количество места, выполните следующую команду:

$ ls -lh /swapfile

#Output
$ -rw-r--r-- 1 root root 1.0G Mar 08 10:30 /swapfile

This подтверждает, что файл подкачки создан с правильным количеством выделенного пространства.


Включение пространства подкачки

Как только файл правильного размера будет доступен, нам нужно на самом деле превратить это в пространство подкачки. Теперь вам нужно заблокировать права доступа к файлу, чтобы только пользователи с указанными правами c могли читать содержимое. Это не позволяет непреднамеренным пользователям иметь доступ к файлу, что может иметь значительные последствия для безопасности. Поэтому вам необходимо выполнить следующие шаги:

  • Сделать файл доступным только для указанного пользователя c, например, root, выполнив следующую команду:

    $ sudo chmod 600 /swapfile
    
  • Проверьте изменение разрешений, выполнив следующую команду:

    $ ls -lh /swapfile
    
    #Output
    -rw------- 1 root root 1.0G Apr 25 11:14 /swapfile
    

    Это подтверждает, что только у пользователя root включены флаги чтения и записи.

  • Теперь вам нужно пометить файл как пространство подкачки, выполнив следующую команду:

    $ sudo mkswap /swapfile
    
    #Sample Output
    Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
    no label, UUID=6e965805-2ab9-450f-aed6-577e74089dbf
    
  • Далее необходимо включить файл подкачки, позволяя системе начать использовать ее, выполнив следующую команду:

    $ sudo swapon /swapfile
    
  • Чтобы проверить доступность свопа, выполните следующую команду:

    $ sudo swapon --show
    
    #Sample Output
    NAME      TYPE  SIZE USED PRIO
    /swapfile file 1024M   0B   -1
    
  • Наконец, еще раз проверьте вывод утилиты free, чтобы проверить настройки, выполнив следующую команду:

    $ free -h
    
    #Sample Output
              total        used        free      shared  buff/cache   available
    Mem:           488M         37M         96M        652K        354M        425M
    Swap:          1.0G          0B        1.0G
    

Заключение

После успешной установки Swap Space базовая операционная система начнет использовать его по мере необходимости.

1 голос
/ 07 марта 2020

Вероятно, произошло то, что браузер Chromium обновлен, теперь занимает больше памяти (или, может быть, утечка памяти хуже ... Вы не говорите, сколько URL-адресов он получает перед смертью)

Как обойти, запустить больший размер экземпляра. Не говорите, какой размер экземпляра вы используете, но если у вас есть t3.micro, попробуйте вместо него t3.medium.

Здесь есть простая для понимания диаграмма https://www.ec2instances.info/?region=eu-west-1

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

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